mirror of
https://github.com/modrinth/code.git
synced 2026-08-03 14:45:55 +00:00
Compare commits
101
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f1d8ed8f30 | ||
|
|
907db9e64a | ||
|
|
944f99a14e | ||
|
|
a79736dba9 | ||
|
|
6f0181d52f | ||
|
|
70c544b048 | ||
|
|
5a80df3cd4 | ||
|
|
1e85ec8649 | ||
|
|
1dd613e459 | ||
|
|
d632b7bdbc | ||
|
|
eb8141134a | ||
|
|
cc0d3bf42c | ||
|
|
5e155d69b6 | ||
|
|
707722ded6 | ||
|
|
dfc2ed3783 | ||
|
|
fbe70c6938 | ||
|
|
cd56b98975 | ||
|
|
b06b14e0fb | ||
|
|
a6d9bb7b3e | ||
|
|
e58af98f21 | ||
|
|
2e0d797bb0 | ||
|
|
508b96c27f | ||
|
|
0512e0b62b | ||
|
|
5c697f675c | ||
|
|
95f97a44ec | ||
|
|
054f1b42fd | ||
|
|
b4d681e713 | ||
|
|
11af2651ef | ||
|
|
dce20777ef | ||
|
|
56ff97ee6f | ||
|
|
d3839ff953 | ||
|
|
d2fb7114f6 | ||
|
|
6c3208a7a5 | ||
|
|
46cbb3be0c | ||
|
|
96e2d95d02 | ||
|
|
07fd4fae5f | ||
|
|
3ca8a911da | ||
|
|
56eeb242de | ||
|
|
68f4b5d86a | ||
|
|
8f387aa9ea | ||
|
|
706d4c1a1e | ||
|
|
39fb75ebf7 | ||
|
|
6c86bb933b | ||
|
|
4bb20e560f | ||
|
|
5302e3a987 | ||
|
|
9b4c84ddd8 | ||
|
|
528a9b76bc | ||
|
|
d322a2b0c8 | ||
|
|
7ac1d17571 | ||
|
|
074699be45 | ||
|
|
7b2e5deb83 | ||
|
|
d0bdeb1bc6 | ||
|
|
832240a45f | ||
|
|
fc1aa28aa4 | ||
|
|
84b4f8e474 | ||
|
|
b14fad4237 | ||
|
|
ff1f86a0f4 | ||
|
|
e8f8722b70 | ||
|
|
518bcd414a | ||
|
|
79013c21c2 | ||
|
|
2e4a050151 | ||
|
|
f780736d89 | ||
|
|
916daa684d | ||
|
|
8ece0bd31c | ||
|
|
e2085c43c5 | ||
|
|
30e23e5cc2 | ||
|
|
8e44f20eec | ||
|
|
932858b5f5 | ||
|
|
8b6f0ec695 | ||
|
|
ee2ad5f05b | ||
|
|
9bfa7c7e4a | ||
|
|
e52ae416a8 | ||
|
|
6319832465 | ||
|
|
7144f08f0f | ||
|
|
c579925f03 | ||
|
|
6b569e4ee4 | ||
|
|
6b62e3b480 | ||
|
|
543cb42210 | ||
|
|
86c6fb8239 | ||
|
|
14e0abb273 | ||
|
|
df653d3e43 | ||
|
|
4aeb6cf9ff | ||
|
|
cb154e205b | ||
|
|
dad5970e8d | ||
|
|
1947d083b3 | ||
|
|
905204cc5f | ||
|
|
8cca911775 | ||
|
|
cafe58dc3c | ||
|
|
13e6ebf4e0 | ||
|
|
1884912126 | ||
|
|
818a9db9f7 | ||
|
|
c431d1fc89 | ||
|
|
4a09ee7ac9 | ||
|
|
31ef22767e | ||
|
|
706d46a6e2 | ||
|
|
ed9394f2f7 | ||
|
|
9e1e8788e2 | ||
|
|
7c4df7442b | ||
|
|
e1556a8ee3 | ||
|
|
1741d12b7b | ||
|
|
0b38cecc74 |
@@ -27,7 +27,7 @@ jobs:
|
|||||||
BUMP_TYPE: minor
|
BUMP_TYPE: minor
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
if: steps.changes.outputs.changed == 'true'
|
if: steps.changes.outputs.changed == 'true'
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
registry-url: https://registry.npmjs.org
|
registry-url: https://registry.npmjs.org
|
||||||
@@ -63,7 +63,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Restore pnpm cache
|
- name: Restore pnpm cache
|
||||||
if: steps.changes.outputs.changed == 'true'
|
if: steps.changes.outputs.changed == 'true'
|
||||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-store.outputs.store-path }}
|
path: ${{ steps.pnpm-store.outputs.store-path }}
|
||||||
key: pnpm-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
key: pnpm-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Cancel Previous Runs
|
- name: Cancel Previous Runs
|
||||||
uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # 0.12.1
|
uses: styfle/cancel-workflow-action@d07a454dad7609a92316b57b23c9ccfd4f59af66 # 0.13.1
|
||||||
with:
|
with:
|
||||||
workflow_id: all
|
workflow_id: all
|
||||||
access_token: ${{ secrets.GITHUB_TOKEN }}
|
access_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Post or update changelog comment
|
- name: Post or update changelog comment
|
||||||
uses: actions/github-script@d746ffe35508b1917358783b479e04febd2b8f71 # v9.0.0
|
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
|
||||||
with:
|
with:
|
||||||
github-token: ${{ secrets.CROWDIN_GH_TOKEN }}
|
github-token: ${{ secrets.CROWDIN_GH_TOKEN }}
|
||||||
script: |
|
script: |
|
||||||
|
|||||||
@@ -12,14 +12,14 @@ jobs:
|
|||||||
typos:
|
typos:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
- uses: crate-ci/typos@6ac2ebd1b93eade61faf7e12688ad87a073fea59 # v1.46.0
|
- uses: crate-ci/typos@bee27e3a4fd1ea2111cf90ab89cd076c870fce14 # v1.48.0
|
||||||
|
|
||||||
# see <https://github.com/influxdata/datafusion-udf-wasm/pull/275>
|
# see <https://github.com/influxdata/datafusion-udf-wasm/pull/275>
|
||||||
tombi:
|
tombi:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
- uses: taiki-e/install-action@fd2f5e3d644b484055ebf4268f474c565f148f25 # v2.81.9
|
- uses: taiki-e/install-action@fd2f5e3d644b484055ebf4268f474c565f148f25 # v2.81.9
|
||||||
with:
|
with:
|
||||||
tool: tombi
|
tool: tombi
|
||||||
|
|||||||
@@ -6,14 +6,15 @@ on:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
|
CARGO_INCREMENTAL: 0
|
||||||
SQLX_OFFLINE: true
|
SQLX_OFFLINE: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
shear:
|
shear:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable
|
- uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 # stable
|
||||||
- uses: cargo-bins/cargo-binstall@dc19f1e48450eefe5a29b8da6c6b00a87d730b37 # v1.18.1
|
- uses: cargo-bins/cargo-binstall@ead08b90bd7b2e6d81963fb9cf0b7239f66d5db4 # v1.21.0
|
||||||
- run: cargo binstall --no-confirm cargo-shear
|
- run: cargo binstall --no-confirm cargo-shear
|
||||||
- run: cargo shear
|
- run: cargo shear
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ jobs:
|
|||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Check if workflow runs on an internal branch
|
- name: Check if workflow runs on an internal branch
|
||||||
id: check-internal
|
id: check-internal
|
||||||
@@ -72,19 +72,15 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
runs-on: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
|
runs-on: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'namespace-profile-medium-amd64' || 'ubuntu-latest' }}
|
||||||
env:
|
|
||||||
SCCACHE_DIR: ${{ needs.skip-if-clean.outputs.internal == 'true' && '/mnt/sccache' || '' }}
|
|
||||||
SCCACHE_CACHE_SIZE: ${{ needs.skip-if-clean.outputs.internal == 'true' && '10G' || '' }}
|
|
||||||
RUSTC_WRAPPER: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'sccache' || '' }}
|
|
||||||
needs: [skip-if-clean]
|
needs: [skip-if-clean]
|
||||||
if: ${{ needs.skip-if-clean.outputs.skip != 'true' }}
|
if: ${{ needs.skip-if-clean.outputs.skip != 'true' }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1.16.0
|
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0
|
||||||
with:
|
with:
|
||||||
rustflags: ''
|
rustflags: ''
|
||||||
cache: false
|
cache: false
|
||||||
@@ -92,26 +88,6 @@ jobs:
|
|||||||
- name: Setup mold
|
- name: Setup mold
|
||||||
uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0
|
uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0
|
||||||
|
|
||||||
- name: Cache Cargo registry and index
|
|
||||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/registry
|
|
||||||
~/.cargo/git
|
|
||||||
~/.cargo/bin
|
|
||||||
key: ${{ runner.os }}-${{ runner.arch }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
|
|
||||||
- name: Mount sccache disk cache
|
|
||||||
if: needs.skip-if-clean.outputs.internal == 'true'
|
|
||||||
uses: useblacksmith/stickydisk@13af8883542ca949a717e70fef89d15edbb29d88 # v1.2.0
|
|
||||||
with:
|
|
||||||
key: ${{ github.repository }}-daedalus-sccache
|
|
||||||
path: /mnt/sccache
|
|
||||||
|
|
||||||
- name: Setup sccache
|
|
||||||
if: needs.skip-if-clean.outputs.internal == 'true'
|
|
||||||
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
|
||||||
|
|
||||||
- name: Build daedalus_client
|
- name: Build daedalus_client
|
||||||
run: cargo build --release --package daedalus_client
|
run: cargo build --release --package daedalus_client
|
||||||
|
|
||||||
@@ -121,11 +97,11 @@ jobs:
|
|||||||
cp target/release/daedalus_client apps/daedalus_client/docker-stage/daedalus_client
|
cp target/release/daedalus_client apps/daedalus_client/docker-stage/daedalus_client
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
|
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
|
||||||
|
|
||||||
- name: Generate Docker image metadata
|
- name: Generate Docker image metadata
|
||||||
id: docker-meta
|
id: docker-meta
|
||||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
|
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
||||||
env:
|
env:
|
||||||
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
|
DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index
|
||||||
with:
|
with:
|
||||||
@@ -140,14 +116,14 @@ jobs:
|
|||||||
org.opencontainers.image.licenses=MIT
|
org.opencontainers.image.licenses=MIT
|
||||||
|
|
||||||
- name: Login to GitHub Packages
|
- name: Login to GitHub Packages
|
||||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
|
uses: docker/login-action@abd2ef45e78c5afb21d64d4ca52ee8550d9572c7 # v4.5.1
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
|
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
||||||
with:
|
with:
|
||||||
context: ./apps/daedalus_client/docker-stage
|
context: ./apps/daedalus_client/docker-stage
|
||||||
file: ./apps/daedalus_client/Dockerfile
|
file: ./apps/daedalus_client/Dockerfile
|
||||||
|
|||||||
@@ -12,10 +12,10 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Log in to GitHub Container Registry
|
- name: Log in to GitHub Container Registry
|
||||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
|
uses: docker/login-action@abd2ef45e78c5afb21d64d4ca52ee8550d9572c7 # v4.5.1
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
environment:
|
preview:
|
||||||
required: true
|
required: false
|
||||||
type: string
|
type: boolean
|
||||||
description: 'The environment to deploy to (staging-preview or production-preview)'
|
description: 'Whether this is a preview deployment'
|
||||||
head_sha:
|
head_sha:
|
||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
@@ -28,44 +28,56 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
description: 'The branch name to deploy (defaults to github.ref_name)'
|
description: 'The branch name to deploy (defaults to github.ref_name)'
|
||||||
|
branch_alias:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
description: 'The persistent preview alias for the branch'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.environment || 'push' }}
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.preview && 'preview' || 'push' }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/prod' }}
|
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/prod' }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: blacksmith-2vcpu-ubuntu-2404
|
runs-on: namespace-profile-modrinth-frontend
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
deployments: write
|
deployments: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Configure environment
|
- name: Configure environment
|
||||||
id: meta
|
id: meta
|
||||||
env:
|
env:
|
||||||
ENV_INPUT: ${{ inputs.environment }}
|
PREVIEW_INPUT: ${{ inputs.preview }}
|
||||||
REF: ${{ github.ref }}
|
REF: ${{ github.ref }}
|
||||||
DEPLOY_SHA: ${{ inputs.head_sha || github.sha }}
|
DEPLOY_SHA: ${{ inputs.head_sha || github.sha }}
|
||||||
|
BRANCH_ALIAS: ${{ inputs.branch_alias }}
|
||||||
run: |
|
run: |
|
||||||
echo "cmd=deploy" >> $GITHUB_OUTPUT
|
echo "cmd=deploy" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
SHA_SHORT="${DEPLOY_SHA::8}"
|
SHA_SHORT="${DEPLOY_SHA::8}"
|
||||||
|
|
||||||
if [ "$ENV_INPUT" = "staging-preview" ]; then
|
if [ "$PREVIEW_INPUT" = "true" ]; then
|
||||||
echo "env=staging" >> $GITHUB_OUTPUT
|
URL="https://git-$SHA_SHORT-frontend.modrinth.workers.dev"
|
||||||
echo "url=https://git-$SHA_SHORT-frontend-staging.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
STAGING_URL="https://git-$SHA_SHORT-staging-frontend.modrinth.workers.dev"
|
||||||
echo "cmd=versions upload --preview-alias git-$SHA_SHORT --var PREVIEW:true" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
elif [ "$ENV_INPUT" = "production-preview" ]; then
|
|
||||||
echo "env=production" >> $GITHUB_OUTPUT
|
echo "env=production" >> $GITHUB_OUTPUT
|
||||||
echo "url=https://git-$SHA_SHORT-frontend.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
echo "url=$URL" >> $GITHUB_OUTPUT
|
||||||
echo "cmd=versions upload --preview-alias git-$SHA_SHORT --var PREVIEW:true" >> $GITHUB_OUTPUT
|
echo "staging_url=$STAGING_URL" >> $GITHUB_OUTPUT
|
||||||
|
echo "cmd=versions upload --preview-alias git-$SHA_SHORT --var PREVIEW:true --var CF_PAGES_URL:$URL" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
STAGING_VARS=$(jq -r '.env.staging.vars | to_entries[] | "--var \(.key):\(.value)"' ./apps/frontend/wrangler.jsonc | tr '\n' ' ')
|
||||||
|
echo "staging_cmd=versions upload --preview-alias git-$SHA_SHORT-staging ${STAGING_VARS}--var PREVIEW:true --var CF_PAGES_URL:$STAGING_URL" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
if [ -n "$BRANCH_ALIAS" ]; then
|
||||||
|
echo "branch_alias_url=https://$BRANCH_ALIAS-frontend.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
||||||
|
echo "staging_branch_alias_url=https://$BRANCH_ALIAS-staging-frontend.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
||||||
|
echo "staging_branch_alias_cmd=versions upload --preview-alias $BRANCH_ALIAS-staging ${STAGING_VARS}--var PREVIEW:true --var CF_PAGES_URL:https://$BRANCH_ALIAS-staging-frontend.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
elif [ "$REF" = "refs/heads/main" ]; then
|
elif [ "$REF" = "refs/heads/main" ]; then
|
||||||
echo "env=staging" >> $GITHUB_OUTPUT
|
echo "env=staging" >> $GITHUB_OUTPUT
|
||||||
@@ -78,24 +90,23 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
|
|
||||||
- name: Enable Corepack
|
- name: Enable Corepack
|
||||||
run: corepack enable
|
run: corepack enable
|
||||||
|
|
||||||
- name: Get pnpm store path
|
- name: Set up caches
|
||||||
id: pnpm-store
|
uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1
|
||||||
run: echo "store-path=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Restore pnpm cache
|
|
||||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-store.outputs.store-path }}
|
cache: |
|
||||||
key: pnpm-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
rust
|
||||||
restore-keys: |
|
pnpm
|
||||||
pnpm-cache-
|
apt
|
||||||
|
|
||||||
|
- name: Set up Turborepo caching
|
||||||
|
uses: namespace-actions/setup-turbocache@f96bd6befa13ae74b2858a5be49573640d4636f5 # v0.0.2
|
||||||
|
|
||||||
- name: Inject build variables
|
- name: Inject build variables
|
||||||
working-directory: ./apps/frontend
|
working-directory: ./apps/frontend
|
||||||
@@ -120,11 +131,11 @@ jobs:
|
|||||||
CF_PAGES_COMMIT_SHA: ${{ inputs.head_sha || github.sha }}
|
CF_PAGES_COMMIT_SHA: ${{ inputs.head_sha || github.sha }}
|
||||||
CF_PAGES_URL: ${{ steps.meta.outputs.url }}
|
CF_PAGES_URL: ${{ steps.meta.outputs.url }}
|
||||||
BUILD_ENV: ${{ steps.meta.outputs.env }}
|
BUILD_ENV: ${{ steps.meta.outputs.env }}
|
||||||
PREVIEW: ${{ inputs.environment != '' && 'true' || 'false' }}
|
PREVIEW: ${{ inputs.preview && 'true' || 'false' }}
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
|
|
||||||
- name: Create Sentry release and upload sourcemaps
|
- name: Create Sentry release and upload sourcemaps
|
||||||
uses: getsentry/action-release@5657c9e888b4e2cc85f4d29143ea4131fde4a73a # v3.6.0
|
uses: getsentry/action-release@ff07929a6537bac57790c3451cf4d364aca38528 # v3.7.0
|
||||||
env:
|
env:
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_ORG: modrinth
|
SENTRY_ORG: modrinth
|
||||||
@@ -134,17 +145,53 @@ jobs:
|
|||||||
sourcemaps: ./apps/frontend/.output/server
|
sourcemaps: ./apps/frontend/.output/server
|
||||||
url_prefix: '~/'
|
url_prefix: '~/'
|
||||||
|
|
||||||
- name: Deploy Cloudflare Worker
|
- name: Install Wrangler CLI
|
||||||
id: wrangler
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
uses: cloudflare/wrangler-action@9acf94ace14e7dc412b076f2c5c20b8ce93c79cd # v3.15.0
|
|
||||||
with:
|
with:
|
||||||
apiToken: ${{ secrets.CF_API_TOKEN }}
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
environment: ${{ steps.meta.outputs.env != 'production' && steps.meta.outputs.env || '' }}
|
|
||||||
workingDirectory: ./apps/frontend
|
workingDirectory: ./apps/frontend
|
||||||
packageManager: pnpm
|
packageManager: pnpm
|
||||||
wranglerVersion: '4.54.0'
|
wranglerVersion: '4.112.0'
|
||||||
command: ${{ steps.meta.outputs.cmd }}
|
command: --version
|
||||||
|
|
||||||
|
- parallel:
|
||||||
|
- name: Deploy Cloudflare Worker
|
||||||
|
id: wrangler
|
||||||
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
|
with:
|
||||||
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
environment: ${{ steps.meta.outputs.env != 'production' && steps.meta.outputs.env || '' }}
|
||||||
|
workingDirectory: ./apps/frontend
|
||||||
|
command: ${{ steps.meta.outputs.cmd }}
|
||||||
|
|
||||||
|
- name: Deploy staging Cloudflare Worker preview
|
||||||
|
if: ${{ inputs.preview }}
|
||||||
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
|
with:
|
||||||
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
workingDirectory: ./apps/frontend
|
||||||
|
command: ${{ steps.meta.outputs.staging_cmd }}
|
||||||
|
|
||||||
|
- name: Deploy persistent Cloudflare Worker preview
|
||||||
|
if: ${{ inputs.preview && inputs.branch_alias != '' }}
|
||||||
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
|
with:
|
||||||
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
workingDirectory: ./apps/frontend
|
||||||
|
command: versions upload --preview-alias ${{ inputs.branch_alias }} --var PREVIEW:true --var CF_PAGES_URL:${{ steps.meta.outputs.branch_alias_url }}
|
||||||
|
|
||||||
|
- name: Deploy persistent staging Cloudflare Worker preview
|
||||||
|
if: ${{ inputs.preview && inputs.branch_alias != '' }}
|
||||||
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
|
with:
|
||||||
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
workingDirectory: ./apps/frontend
|
||||||
|
command: ${{ steps.meta.outputs.staging_branch_alias_cmd }}
|
||||||
|
|
||||||
- name: Purge cache
|
- name: Purge cache
|
||||||
if: github.ref == 'refs/heads/prod'
|
if: github.ref == 'refs/heads/prod'
|
||||||
@@ -155,14 +202,23 @@ jobs:
|
|||||||
--data '{"hosts": ["modrinth.com", "www.modrinth.com", "staging.modrinth.com"]}' \
|
--data '{"hosts": ["modrinth.com", "www.modrinth.com", "staging.modrinth.com"]}' \
|
||||||
https://api.cloudflare.com/client/v4/zones/e39df17b9c4ef44cbce2646346ee6d33/purge_cache
|
https://api.cloudflare.com/client/v4/zones/e39df17b9c4ef44cbce2646346ee6d33/purge_cache
|
||||||
|
|
||||||
- name: Write deployment URL to file
|
- name: Write deployment URLs to files
|
||||||
if: ${{ inputs.environment != '' }}
|
if: ${{ inputs.preview }}
|
||||||
run: |
|
run: |
|
||||||
echo "${{ steps.meta.outputs.url }}" > deployment-url-${{ inputs.environment }}.txt
|
echo "${{ steps.meta.outputs.url }}" > deployment-url-production.txt
|
||||||
|
echo "${{ steps.meta.outputs.staging_url }}" > deployment-url-staging.txt
|
||||||
|
|
||||||
- name: Upload deployment URL
|
- parallel:
|
||||||
if: ${{ inputs.environment != '' }}
|
- name: Upload production deployment URL
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
if: ${{ inputs.preview }}
|
||||||
with:
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||||
name: deployment-url-${{ inputs.environment }}
|
with:
|
||||||
path: deployment-url-${{ inputs.environment }}.txt
|
name: deployment-url-production
|
||||||
|
path: deployment-url-production.txt
|
||||||
|
|
||||||
|
- name: Upload staging deployment URL
|
||||||
|
if: ${{ inputs.preview }}
|
||||||
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||||
|
with:
|
||||||
|
name: deployment-url-staging
|
||||||
|
path: deployment-url-staging.txt
|
||||||
|
|||||||
@@ -12,24 +12,34 @@ on:
|
|||||||
- '.github/workflows/frontend-preview.yml'
|
- '.github/workflows/frontend-preview.yml'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
metadata:
|
||||||
|
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
branch-alias: ${{ steps.meta.outputs.branch_alias }}
|
||||||
|
steps:
|
||||||
|
- name: Configure branch alias
|
||||||
|
id: meta
|
||||||
|
run: echo "branch_alias=pr-${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
|
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
needs: metadata
|
||||||
uses: ./.github/workflows/frontend-deploy.yml
|
uses: ./.github/workflows/frontend-deploy.yml
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ matrix.environment }}
|
group: ${{ github.workflow }}-${{ github.ref }}-deploy
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
environment: [staging-preview, production-preview]
|
|
||||||
with:
|
with:
|
||||||
environment: ${{ matrix.environment }}
|
preview: true
|
||||||
head_sha: ${{ github.event.pull_request.head.sha }}
|
head_sha: ${{ github.event.pull_request.head.sha }}
|
||||||
head_ref: ${{ github.event.pull_request.head.ref }}
|
head_ref: ${{ github.event.pull_request.head.ref }}
|
||||||
|
branch_alias: ${{ needs.metadata.outputs.branch-alias }}
|
||||||
|
|
||||||
deploy-storybook:
|
deploy-storybook:
|
||||||
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
|
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
|
||||||
runs-on: blacksmith-2vcpu-ubuntu-2404
|
needs: metadata
|
||||||
|
runs-on: namespace-profile-modrinth-frontend
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-storybook
|
group: ${{ github.workflow }}-${{ github.ref }}-storybook
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
@@ -38,27 +48,21 @@ jobs:
|
|||||||
deployments: write
|
deployments: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
|
|
||||||
- name: Enable Corepack
|
- name: Enable Corepack
|
||||||
run: corepack enable
|
run: corepack enable
|
||||||
|
|
||||||
- name: Get pnpm store path
|
- name: Set up caches
|
||||||
id: pnpm-store
|
uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1
|
||||||
run: echo "store-path=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Restore pnpm cache
|
|
||||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-store.outputs.store-path }}
|
cache: |
|
||||||
key: pnpm-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
pnpm
|
||||||
restore-keys: |
|
|
||||||
pnpm-cache-
|
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
working-directory: ./packages/ui
|
working-directory: ./packages/ui
|
||||||
@@ -66,6 +70,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Build Storybook
|
- name: Build Storybook
|
||||||
working-directory: ./packages/ui
|
working-directory: ./packages/ui
|
||||||
|
env:
|
||||||
|
NODE_OPTIONS: --max-old-space-size=6144
|
||||||
run: pnpm run build-storybook
|
run: pnpm run build-storybook
|
||||||
|
|
||||||
- name: Configure short SHA
|
- name: Configure short SHA
|
||||||
@@ -74,20 +80,43 @@ jobs:
|
|||||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
run: echo "sha_short=${HEAD_SHA::8}" >> $GITHUB_OUTPUT
|
run: echo "sha_short=${HEAD_SHA::8}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Deploy Storybook preview
|
- name: Install Wrangler CLI
|
||||||
uses: cloudflare/wrangler-action@9acf94ace14e7dc412b076f2c5c20b8ce93c79cd # v3.15.0
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
with:
|
with:
|
||||||
apiToken: ${{ secrets.CF_API_TOKEN }}
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
workingDirectory: ./packages/ui
|
workingDirectory: ./packages/ui
|
||||||
packageManager: pnpm
|
packageManager: pnpm
|
||||||
wranglerVersion: '4.54.0'
|
wranglerVersion: '4.112.0'
|
||||||
command: versions upload --preview-alias git-${{ steps.meta.outputs.sha_short }}
|
command: --version
|
||||||
|
|
||||||
|
- parallel:
|
||||||
|
- name: Deploy Storybook preview
|
||||||
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
|
with:
|
||||||
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
workingDirectory: ./packages/ui
|
||||||
|
command: versions upload --preview-alias git-${{ steps.meta.outputs.sha_short }}
|
||||||
|
|
||||||
|
- name: Deploy persistent Storybook preview
|
||||||
|
uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0
|
||||||
|
env:
|
||||||
|
NODE_OPTIONS: --max-old-space-size=6144
|
||||||
|
with:
|
||||||
|
apiToken: ${{ secrets.CF_API_TOKEN }}
|
||||||
|
accountId: ${{ secrets.CF_ACCOUNT_ID }}
|
||||||
|
workingDirectory: ./packages/ui
|
||||||
|
command: versions upload --preview-alias ${{ needs.metadata.outputs.branch-alias }}
|
||||||
|
|
||||||
comment:
|
comment:
|
||||||
if: github.repository_owner == 'modrinth' && github.event.pull_request.head.repo.full_name == github.repository
|
if: |
|
||||||
|
!cancelled()
|
||||||
|
&& github.repository_owner == 'modrinth'
|
||||||
|
&& github.event.pull_request.head.repo.full_name == github.repository
|
||||||
|
&& needs.deploy.result == 'success'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [deploy, deploy-storybook]
|
needs: [metadata, deploy, deploy-storybook]
|
||||||
steps:
|
steps:
|
||||||
- name: Download deployment URLs
|
- name: Download deployment URLs
|
||||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||||
@@ -99,16 +128,29 @@ jobs:
|
|||||||
id: urls
|
id: urls
|
||||||
env:
|
env:
|
||||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
|
BRANCH_ALIAS: ${{ needs.metadata.outputs.branch-alias }}
|
||||||
|
STORYBOOK_RESULT: ${{ needs.deploy-storybook.result }}
|
||||||
|
RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||||
run: |
|
run: |
|
||||||
STAGING_PREVIEW_URL=$(cat deployment-url-staging-preview.txt)
|
STAGING_SHA_URL=$(cat deployment-url-staging.txt)
|
||||||
PRODUCTION_PREVIEW_URL=$(cat deployment-url-production-preview.txt)
|
PRODUCTION_SHA_URL=$(cat deployment-url-production.txt)
|
||||||
|
STAGING_BRANCH_URL="https://$BRANCH_ALIAS-staging-frontend.modrinth.workers.dev"
|
||||||
|
PRODUCTION_BRANCH_URL="https://$BRANCH_ALIAS-frontend.modrinth.workers.dev"
|
||||||
|
|
||||||
echo "Production preview URL: $PRODUCTION_PREVIEW_URL"
|
if [ "$STORYBOOK_RESULT" = "success" ]; then
|
||||||
echo "Staging preview URL: $STAGING_PREVIEW_URL"
|
STORYBOOK_SHA_URL="https://git-${HEAD_SHA::8}-storybook.modrinth.workers.dev"
|
||||||
|
STORYBOOK_BRANCH_URL="https://$BRANCH_ALIAS-storybook.modrinth.workers.dev"
|
||||||
|
else
|
||||||
|
STORYBOOK_SHA_URL="⚠️ Deployment $STORYBOOK_RESULT ([logs]($RUN_URL))"
|
||||||
|
STORYBOOK_BRANCH_URL="⚠️ Deployment $STORYBOOK_RESULT ([logs]($RUN_URL))"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "staging-preview-url=$STAGING_PREVIEW_URL" >> $GITHUB_OUTPUT
|
echo "staging-sha-url=$STAGING_SHA_URL" >> $GITHUB_OUTPUT
|
||||||
echo "production-preview-url=$PRODUCTION_PREVIEW_URL" >> $GITHUB_OUTPUT
|
echo "production-sha-url=$PRODUCTION_SHA_URL" >> $GITHUB_OUTPUT
|
||||||
echo "storybook-preview-url=https://git-${HEAD_SHA::8}-storybook.modrinth.workers.dev" >> $GITHUB_OUTPUT
|
echo "storybook-sha-url=$STORYBOOK_SHA_URL" >> $GITHUB_OUTPUT
|
||||||
|
echo "staging-branch-url=$STAGING_BRANCH_URL" >> $GITHUB_OUTPUT
|
||||||
|
echo "production-branch-url=$PRODUCTION_BRANCH_URL" >> $GITHUB_OUTPUT
|
||||||
|
echo "storybook-branch-url=$STORYBOOK_BRANCH_URL" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Find comment
|
- name: Find comment
|
||||||
if: github.event_name == 'pull_request'
|
if: github.event_name == 'pull_request'
|
||||||
@@ -131,9 +173,19 @@ jobs:
|
|||||||
|
|
||||||
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 }})
|
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 }})
|
||||||
|
|
||||||
|
### Persistent
|
||||||
|
|
||||||
| Environment | URL |
|
| Environment | URL |
|
||||||
|-------------|-----|
|
|-------------|-----|
|
||||||
| staging | ${{ steps.urls.outputs.staging-preview-url }} |
|
| staging | ${{ steps.urls.outputs.staging-branch-url }} |
|
||||||
| production | ${{ steps.urls.outputs.production-preview-url }} |
|
| production | ${{ steps.urls.outputs.production-branch-url }} |
|
||||||
| storybook | ${{ steps.urls.outputs.storybook-preview-url }} |
|
| storybook | ${{ steps.urls.outputs.storybook-branch-url }} |
|
||||||
|
|
||||||
|
### Latest commit
|
||||||
|
|
||||||
|
| Environment | URL |
|
||||||
|
|-------------|-----|
|
||||||
|
| staging | ${{ steps.urls.outputs.staging-sha-url }} |
|
||||||
|
| production | ${{ steps.urls.outputs.production-sha-url }} |
|
||||||
|
| storybook | ${{ steps.urls.outputs.storybook-sha-url }} |
|
||||||
edit-mode: replace
|
edit-mode: replace
|
||||||
|
|||||||
@@ -51,13 +51,13 @@ jobs:
|
|||||||
CROWDIN_GH_TOKEN_DEFINED: ${{ secrets.CROWDIN_GH_TOKEN != '' }}
|
CROWDIN_GH_TOKEN_DEFINED: ${{ secrets.CROWDIN_GH_TOKEN != '' }}
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.ref }}
|
ref: ${{ github.ref }}
|
||||||
token: ${{ secrets.CROWDIN_GH_TOKEN }}
|
token: ${{ secrets.CROWDIN_GH_TOKEN }}
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ jobs:
|
|||||||
echo "safe_branch_name=$SAFE_BRANCH_NAME" >> "$GITHUB_OUTPUT"
|
echo "safe_branch_name=$SAFE_BRANCH_NAME" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Download translations from Crowdin
|
- name: Download translations from Crowdin
|
||||||
uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # v2.16.2
|
uses: crowdin/github-action@c7af9bc98b01694653031fef2a0dc6c7888ce9bc # v2.17.0
|
||||||
with:
|
with:
|
||||||
upload_sources: false
|
upload_sources: false
|
||||||
upload_translations: false
|
upload_translations: false
|
||||||
|
|||||||
@@ -56,13 +56,13 @@ jobs:
|
|||||||
CROWDIN_PERSONAL_TOKEN_DEFINED: ${{ secrets.CROWDIN_PERSONAL_TOKEN != '' }}
|
CROWDIN_PERSONAL_TOKEN_DEFINED: ${{ secrets.CROWDIN_PERSONAL_TOKEN != '' }}
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.ref }}
|
ref: ${{ github.ref }}
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ jobs:
|
|||||||
echo "safe_branch_name=$SAFE_BRANCH_NAME" >> "$GITHUB_OUTPUT"
|
echo "safe_branch_name=$SAFE_BRANCH_NAME" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
- name: Upload translations to Crowdin
|
- name: Upload translations to Crowdin
|
||||||
uses: crowdin/github-action@8868a33591d21088edfc398968173a3b98d51706 # v2.16.2
|
uses: crowdin/github-action@c7af9bc98b01694653031fef2a0dc6c7888ce9bc # v2.17.0
|
||||||
with:
|
with:
|
||||||
upload_sources: true
|
upload_sources: true
|
||||||
upload_translations: false
|
upload_translations: false
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Check if workflow runs on an internal branch
|
- name: Check if workflow runs on an internal branch
|
||||||
id: check-internal
|
id: check-internal
|
||||||
@@ -70,22 +70,21 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
docker:
|
docker:
|
||||||
runs-on: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
|
runs-on: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'namespace-profile-modrinth-labrinth' || 'ubuntu-latest' }}
|
||||||
needs: [skip-if-clean]
|
needs: [skip-if-clean]
|
||||||
if: ${{ needs.skip-if-clean.outputs.skip != 'true' }}
|
if: ${{ needs.skip-if-clean.outputs.skip != 'true' }}
|
||||||
env:
|
env:
|
||||||
SQLX_OFFLINE: 'true'
|
SQLX_OFFLINE: 'true'
|
||||||
GIT_HASH: ${{ github.sha }}
|
GIT_HASH: ${{ github.sha }}
|
||||||
SCCACHE_DIR: ${{ needs.skip-if-clean.outputs.internal == 'true' && '/mnt/sccache' || '' }}
|
SCCACHE_CACHE_SIZE: ${{ needs.skip-if-clean.outputs.internal == 'true' && '20G' || '' }}
|
||||||
SCCACHE_CACHE_SIZE: ${{ needs.skip-if-clean.outputs.internal == 'true' && '10G' || '' }}
|
|
||||||
RUSTC_WRAPPER: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'sccache' || '' }}
|
RUSTC_WRAPPER: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'sccache' || '' }}
|
||||||
RUST_MIN_STACK: '16777216'
|
RUST_MIN_STACK: '16777216'
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1.16.0
|
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0
|
||||||
with:
|
with:
|
||||||
rustflags: ''
|
rustflags: ''
|
||||||
cache: false
|
cache: false
|
||||||
@@ -93,32 +92,23 @@ jobs:
|
|||||||
- name: Setup mold
|
- name: Setup mold
|
||||||
uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0
|
uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0
|
||||||
|
|
||||||
|
- name: Setup sccache
|
||||||
|
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
||||||
|
|
||||||
|
- name: Set up caches
|
||||||
|
if: needs.skip-if-clean.outputs.internal == 'true'
|
||||||
|
uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1
|
||||||
|
with:
|
||||||
|
cache: |
|
||||||
|
rust
|
||||||
|
apt
|
||||||
|
|
||||||
|
- name: Configure sccache
|
||||||
|
if: needs.skip-if-clean.outputs.internal == 'true'
|
||||||
|
run: nsc cache sccache setup --cache_name default >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Install build dependencies
|
- name: Install build dependencies
|
||||||
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends cmake libcurl4-openssl-dev
|
run: sudo apt-get update && sudo apt-get install -y --no-install-recommends cmake libcurl4-openssl-dev
|
||||||
#uses: awalsh128/cache-apt-pkgs-action@acb598e5ddbc6f68a970c5da0688d2f3a9f04d05 # v1.6.0
|
|
||||||
#with:
|
|
||||||
# packages: cmake libcurl4-openssl-dev
|
|
||||||
# version: v2 # cache key
|
|
||||||
|
|
||||||
- name: Cache Cargo registry and index
|
|
||||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/registry
|
|
||||||
~/.cargo/git
|
|
||||||
~/.cargo/bin
|
|
||||||
key: ${{ runner.os }}-${{ runner.arch }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
|
|
||||||
- name: Mount sccache disk cache
|
|
||||||
if: needs.skip-if-clean.outputs.internal == 'true'
|
|
||||||
uses: useblacksmith/stickydisk@13af8883542ca949a717e70fef89d15edbb29d88 # v1.2.0
|
|
||||||
with:
|
|
||||||
key: ${{ github.repository }}-labrinth-sccache
|
|
||||||
path: /mnt/sccache
|
|
||||||
|
|
||||||
- name: Setup sccache
|
|
||||||
if: needs.skip-if-clean.outputs.internal == 'true'
|
|
||||||
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
|
||||||
|
|
||||||
- name: Build labrinth
|
- name: Build labrinth
|
||||||
run: cargo build --profile release-labrinth --package labrinth
|
run: cargo build --profile release-labrinth --package labrinth
|
||||||
@@ -131,11 +121,11 @@ jobs:
|
|||||||
cp -r apps/labrinth/assets apps/labrinth/docker-stage/assets
|
cp -r apps/labrinth/assets apps/labrinth/docker-stage/assets
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0
|
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
|
||||||
|
|
||||||
- name: Generate Docker image metadata
|
- name: Generate Docker image metadata
|
||||||
id: docker-meta
|
id: docker-meta
|
||||||
uses: docker/metadata-action@030e881283bb7a6894de51c315a6bfe6a94e05cf # v6.0.0
|
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
||||||
env:
|
env:
|
||||||
# GitHub Packages requires annotations metadata in at least the index descriptor to show them
|
# GitHub Packages requires annotations metadata in at least the index descriptor to show them
|
||||||
# up properly in its UI it seems, but it's not clear about it, because the docs refer to the
|
# up properly in its UI it seems, but it's not clear about it, because the docs refer to the
|
||||||
@@ -154,14 +144,14 @@ jobs:
|
|||||||
org.opencontainers.image.licenses=AGPL-3.0-only
|
org.opencontainers.image.licenses=AGPL-3.0-only
|
||||||
|
|
||||||
- name: Login to GitHub Packages
|
- name: Login to GitHub Packages
|
||||||
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0
|
uses: docker/login-action@abd2ef45e78c5afb21d64d4ca52ee8550d9572c7 # v4.5.1
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7.1.0
|
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
||||||
with:
|
with:
|
||||||
context: ./apps/labrinth/docker-stage
|
context: ./apps/labrinth/docker-stage
|
||||||
file: ./apps/labrinth/Dockerfile
|
file: ./apps/labrinth/Dockerfile
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
name: Prepare pnpm cache
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- .github/workflows/prepare-pnpm-cache.yml
|
|
||||||
- package.json
|
|
||||||
- pnpm-lock.yaml
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/prod' }}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
prepare:
|
|
||||||
if: github.repository_owner == 'modrinth'
|
|
||||||
runs-on: blacksmith-2vcpu-ubuntu-2404
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: .nvmrc
|
|
||||||
|
|
||||||
- name: Enable Corepack
|
|
||||||
run: corepack enable
|
|
||||||
|
|
||||||
- name: Get pnpm store path
|
|
||||||
id: pnpm-store
|
|
||||||
run: echo "store-path=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Cache pnpm
|
|
||||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
|
||||||
with:
|
|
||||||
path: ${{ steps.pnpm-store.outputs.store-path }}
|
|
||||||
key: pnpm-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm recursive install --frozen-lockfile
|
|
||||||
@@ -44,42 +44,34 @@ jobs:
|
|||||||
name: Build
|
name: Build
|
||||||
env:
|
env:
|
||||||
VITE_STRIPE_PUBLISHABLE_KEY: pk_live_51JbFxJJygY5LJFfKLVVldb10HlLt24p421OWRsTOWc5sXYFOnFUXWieSc6HD3PHo25ktx8db1WcHr36XGFvZFVUz00V9ixrCs5
|
VITE_STRIPE_PUBLISHABLE_KEY: pk_live_51JbFxJJygY5LJFfKLVVldb10HlLt24p421OWRsTOWc5sXYFOnFUXWieSc6HD3PHo25ktx8db1WcHr36XGFvZFVUz00V9ixrCs5
|
||||||
# SCCACHE_DIR: '/mnt/sccache'
|
|
||||||
# SCCACHE_CACHE_SIZE: '10G'
|
|
||||||
# SCCACHE_MULTILEVEL_CHAIN: 'disk,s3'
|
|
||||||
SCCACHE_S3_KEY_PREFIX: '${{ github.repository }}/'
|
|
||||||
SCCACHE_BUCKET: ${{ secrets.SCCACHE_BUCKET }}
|
|
||||||
SCCACHE_REGION: ${{ secrets.SCCACHE_REGION }}
|
|
||||||
SCCACHE_ENDPOINT: ${{ secrets.SCCACHE_ENDPOINT }}
|
|
||||||
AWS_ACCESS_KEY_ID: ${{ secrets.SCCACHE_S3_ACCESS_KEY_ID }}
|
|
||||||
AWS_SECRET_ACCESS_KEY: ${{ secrets.SCCACHE_S3_SECRET_ACCESS_KEY }}
|
|
||||||
RUSTC_WRAPPER: 'sccache'
|
RUSTC_WRAPPER: 'sccache'
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [
|
platform:
|
||||||
blacksmith-6vcpu-macos-26,
|
[
|
||||||
blacksmith-8vcpu-windows-2025, # At time of writing, Windows 4 vCPU VMs don't seem to actually exist
|
namespace-profile-medium-amd64-macos,
|
||||||
blacksmith-4vcpu-ubuntu-2404,
|
namespace-profile-medium-amd64-windows,
|
||||||
|
namespace-profile-medium-amd64,
|
||||||
]
|
]
|
||||||
include:
|
include:
|
||||||
- platform: blacksmith-6vcpu-macos-26
|
- platform: namespace-profile-medium-amd64-macos
|
||||||
artifact-target-name: universal-apple-darwin
|
artifact-target-name: universal-apple-darwin
|
||||||
- platform: blacksmith-8vcpu-windows-2025
|
- platform: namespace-profile-medium-amd64-windows
|
||||||
artifact-target-name: x86_64-pc-windows-msvc
|
artifact-target-name: x86_64-pc-windows-msvc
|
||||||
- platform: blacksmith-4vcpu-ubuntu-2404
|
- platform: namespace-profile-medium-amd64
|
||||||
artifact-target-name: x86_64-unknown-linux-gnu
|
artifact-target-name: x86_64-unknown-linux-gnu
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1.16.0
|
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0
|
||||||
with:
|
with:
|
||||||
rustflags: ''
|
rustflags: ''
|
||||||
target: ${{ contains(matrix.platform, 'macos') && 'x86_64-apple-darwin' || '' }}
|
target: ${{ contains(matrix.platform, 'macos') && 'x86_64-apple-darwin' || '' }}
|
||||||
@@ -91,14 +83,25 @@ jobs:
|
|||||||
- name: Setup sccache
|
- name: Setup sccache
|
||||||
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
||||||
|
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
|
with:
|
||||||
|
node-version-file: .nvmrc
|
||||||
|
|
||||||
- name: Enable Corepack
|
- name: Enable Corepack
|
||||||
run: corepack enable
|
run: corepack enable
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Set up caches
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
if: contains(matrix.platform, 'ubuntu') || contains(matrix.platform, 'macos')
|
||||||
|
uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
cache: |
|
||||||
cache: 'pnpm'
|
rust
|
||||||
|
pnpm
|
||||||
|
|
||||||
|
- name: Configure sccache
|
||||||
|
if: contains(matrix.platform, 'ubuntu') || contains(matrix.platform, 'macos')
|
||||||
|
run: nsc cache sccache setup --cache_name default >> "$GITHUB_ENV"
|
||||||
|
|
||||||
- name: Generate tauri-dev.conf.json
|
- name: Generate tauri-dev.conf.json
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -117,10 +120,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Linux build dependencies
|
- name: Install Linux build dependencies
|
||||||
if: contains(matrix.platform, 'ubuntu')
|
if: contains(matrix.platform, 'ubuntu')
|
||||||
uses: awalsh128/cache-apt-pkgs-action@acb598e5ddbc6f68a970c5da0688d2f3a9f04d05 # v1.6.0
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev
|
||||||
|
|
||||||
|
- name: Setup Java
|
||||||
|
uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5.6.0
|
||||||
with:
|
with:
|
||||||
packages: libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev
|
distribution: temurin
|
||||||
version: v1 # cache key
|
java-version: 17
|
||||||
|
|
||||||
- name: Setup Dasel
|
- name: Setup Dasel
|
||||||
uses: jaxxstorm/action-install-gh-release@25e24d2d23ae098373794ef1d6faecb48ee52da8 # v3.0.0
|
uses: jaxxstorm/action-install-gh-release@25e24d2d23ae098373794ef1d6faecb48ee52da8 # v3.0.0
|
||||||
@@ -147,9 +155,6 @@ jobs:
|
|||||||
|
|
||||||
cp "packages/app-lib/.env.${BUILD_ENVIRONMENT}" packages/app-lib/.env
|
cp "packages/app-lib/.env.${BUILD_ENVIRONMENT}" packages/app-lib/.env
|
||||||
|
|
||||||
- name: Setup Turbo cache
|
|
||||||
uses: rharkor/caching-for-turbo@56219402aacc0d06b650d898c222996dbc1191ec # v2.3.14
|
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ jobs:
|
|||||||
github.event.workflow_run.conclusion == 'success' &&
|
github.event.workflow_run.conclusion == 'success' &&
|
||||||
github.event.workflow_run.event == 'push' &&
|
github.event.workflow_run.event == 'push' &&
|
||||||
startsWith(github.event.workflow_run.head_branch, 'v')
|
startsWith(github.event.workflow_run.head_branch, 'v')
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
runs-on: namespace-profile-medium-amd64
|
||||||
env:
|
env:
|
||||||
VERSION_TAG: ${{ github.event.workflow_run.head_branch }}
|
VERSION_TAG: ${{ github.event.workflow_run.head_branch }}
|
||||||
LINUX_X64_BUNDLE_ARTIFACT_NAME: App bundle (x86_64-unknown-linux-gnu)
|
LINUX_X64_BUNDLE_ARTIFACT_NAME: App bundle (x86_64-unknown-linux-gnu)
|
||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Verify ref is a tag
|
- name: Verify ref is a tag
|
||||||
env:
|
env:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
|
|
||||||
- name: Check if workflow runs on an internal branch
|
- name: Check if workflow runs on an internal branch
|
||||||
id: check-internal
|
id: check-internal
|
||||||
@@ -62,7 +62,7 @@ jobs:
|
|||||||
|
|
||||||
build:
|
build:
|
||||||
name: Lint and Test
|
name: Lint and Test
|
||||||
runs-on: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-latest' }}
|
runs-on: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'namespace-profile-modrinth-turbo' || 'ubuntu-latest' }}
|
||||||
needs: [skip-if-clean]
|
needs: [skip-if-clean]
|
||||||
if: ${{ needs.skip-if-clean.outputs.skip != 'true' }}
|
if: ${{ needs.skip-if-clean.outputs.skip != 'true' }}
|
||||||
|
|
||||||
@@ -76,47 +76,47 @@ jobs:
|
|||||||
# since we don't want warnings to become errors
|
# since we don't want warnings to become errors
|
||||||
# while developing)
|
# while developing)
|
||||||
RUSTFLAGS: -Dwarnings
|
RUSTFLAGS: -Dwarnings
|
||||||
# sccache config (only populated for internal branches; secrets aren't
|
# Redis config for tests
|
||||||
# available to forked PRs, and blacksmith stickydisk requires a
|
REDIS_TOPOLOGY: cluster
|
||||||
# blacksmith runner)
|
REDIS_CONNECTION_TYPE: multiplexed
|
||||||
SCCACHE_DIR: ${{ needs.skip-if-clean.outputs.internal == 'true' && '/mnt/sccache' || '' }}
|
REDIS_URL: redis://127.0.0.1:7000,redis://127.0.0.1:7001,redis://127.0.0.1:7002,redis://127.0.0.1:7003,redis://127.0.0.1:7004,redis://127.0.0.1:7005
|
||||||
SCCACHE_CACHE_SIZE: ${{ needs.skip-if-clean.outputs.internal == 'true' && '10G' || '' }}
|
# Avoid stack overflows in tests
|
||||||
RUSTC_WRAPPER: ${{ needs.skip-if-clean.outputs.internal == 'true' && 'sccache' || '' }}
|
RUST_MIN_STACK: 33554432
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out code
|
- name: Check out code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 2
|
fetch-depth: 2
|
||||||
|
|
||||||
- name: Install build dependencies
|
|
||||||
uses: awalsh128/cache-apt-pkgs-action@acb598e5ddbc6f68a970c5da0688d2f3a9f04d05 # v1.6.0
|
|
||||||
with:
|
|
||||||
packages: cmake libcurl4-openssl-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev
|
|
||||||
version: v2 # cache key
|
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
|
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
|
|
||||||
- name: Enable Corepack
|
- name: Enable Corepack
|
||||||
run: corepack enable
|
run: corepack enable
|
||||||
|
|
||||||
- name: Get pnpm store path
|
- name: Set up caches
|
||||||
id: pnpm-store
|
if: needs.skip-if-clean.outputs.internal == 'true'
|
||||||
run: echo "store-path=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
|
uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1
|
||||||
|
|
||||||
- name: Restore pnpm cache
|
|
||||||
uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
|
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.pnpm-store.outputs.store-path }}
|
cache: |
|
||||||
key: pnpm-cache-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
rust
|
||||||
restore-keys: |
|
pnpm
|
||||||
pnpm-cache-
|
apt
|
||||||
|
|
||||||
|
- name: Set up Turborepo caching
|
||||||
|
if: needs.skip-if-clean.outputs.internal == 'true'
|
||||||
|
uses: namespace-actions/setup-turbocache@f96bd6befa13ae74b2858a5be49573640d4636f5 # v0.0.2
|
||||||
|
|
||||||
|
- name: Install apt dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y cmake libcurl4-openssl-dev libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev
|
||||||
|
|
||||||
- name: Setup Rust toolchain
|
- name: Setup Rust toolchain
|
||||||
uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1.16.0
|
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0
|
||||||
with:
|
with:
|
||||||
rustflags: ''
|
rustflags: ''
|
||||||
components: clippy, rustfmt
|
components: clippy, rustfmt
|
||||||
@@ -125,28 +125,8 @@ jobs:
|
|||||||
- name: Setup mold
|
- name: Setup mold
|
||||||
uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0
|
uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0
|
||||||
|
|
||||||
- name: Cache Cargo registry and index
|
|
||||||
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae #v5.0.5
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/registry
|
|
||||||
~/.cargo/git
|
|
||||||
~/.cargo/bin
|
|
||||||
key: ${{ runner.os }}-${{ runner.arch }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
|
|
||||||
- name: Mount sccache disk cache
|
|
||||||
if: needs.skip-if-clean.outputs.internal == 'true'
|
|
||||||
uses: useblacksmith/stickydisk@13af8883542ca949a717e70fef89d15edbb29d88 # v1.2.0
|
|
||||||
with:
|
|
||||||
key: ${{ github.repository }}-turbo-sccache
|
|
||||||
path: /mnt/sccache
|
|
||||||
|
|
||||||
- name: Setup sccache
|
|
||||||
if: needs.skip-if-clean.outputs.internal == 'true'
|
|
||||||
uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10
|
|
||||||
|
|
||||||
- name: Setup binstall
|
- name: Setup binstall
|
||||||
uses: cargo-bins/cargo-binstall@dc19f1e48450eefe5a29b8da6c6b00a87d730b37 # v1.18.1
|
uses: cargo-bins/cargo-binstall@ead08b90bd7b2e6d81963fb9cf0b7239f66d5db4 # v1.21.0
|
||||||
|
|
||||||
- name: Setup nextest
|
- name: Setup nextest
|
||||||
run: cargo binstall --no-confirm --secure --locked cargo-nextest@0.9.133
|
run: cargo binstall --no-confirm --secure --locked cargo-nextest@0.9.133
|
||||||
@@ -154,16 +134,13 @@ jobs:
|
|||||||
# cargo-binstall does not have pre-built binaries for sqlx-cli, so we fall
|
# cargo-binstall does not have pre-built binaries for sqlx-cli, so we fall
|
||||||
# back to a cached cargo install
|
# back to a cached cargo install
|
||||||
- name: Setup cargo-sqlx
|
- name: Setup cargo-sqlx
|
||||||
uses: taiki-e/cache-cargo-install-action@f9eed3e4680f27610dc6d8c67be1b88593f7dade # v3.0.6
|
uses: taiki-e/cache-cargo-install-action@417450f3c33ee20393705369577571770643d4c7 # v3.0.7
|
||||||
with:
|
with:
|
||||||
tool: sqlx-cli@0.8.6
|
tool: sqlx-cli@0.8.6
|
||||||
locked: false
|
locked: false
|
||||||
no-default-features: true
|
no-default-features: true
|
||||||
features: rustls,postgres
|
features: rustls,postgres
|
||||||
|
|
||||||
- name: Setup Turbo cache
|
|
||||||
uses: rharkor/caching-for-turbo@56219402aacc0d06b650d898c222996dbc1191ec # v2.3.14
|
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: pnpm install
|
run: pnpm install
|
||||||
|
|
||||||
@@ -185,7 +162,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Start services
|
- name: Start services
|
||||||
if: steps.check-labrinth.outputs.needs_services == 'true'
|
if: steps.check-labrinth.outputs.needs_services == 'true'
|
||||||
run: docker compose up --wait
|
run: docker compose --profile clustered-redis up --wait
|
||||||
|
|
||||||
- name: Setup labrinth environment and database
|
- name: Setup labrinth environment and database
|
||||||
if: steps.check-labrinth.outputs.needs_services == 'true'
|
if: steps.check-labrinth.outputs.needs_services == 'true'
|
||||||
|
|||||||
Generated
+184
-42
@@ -244,7 +244,7 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_urlencoded",
|
"serde_urlencoded",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
"socket2 0.6.1",
|
"socket2 0.6.5",
|
||||||
"time",
|
"time",
|
||||||
"tracing",
|
"tracing",
|
||||||
"url",
|
"url",
|
||||||
@@ -458,6 +458,12 @@ version = "1.7.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
|
checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "arcstr"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "03918c3dbd7701a85c6b9887732e2921175f26c350b4563841d0958c21d57e6d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arg_enum_proc_macro"
|
name = "arg_enum_proc_macro"
|
||||||
version = "0.3.4"
|
version = "0.3.4"
|
||||||
@@ -2133,6 +2139,15 @@ dependencies = [
|
|||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cobs"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"
|
||||||
|
dependencies = [
|
||||||
|
"thiserror 2.0.17",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "color-eyre"
|
name = "color-eyre"
|
||||||
version = "0.6.5"
|
version = "0.6.5"
|
||||||
@@ -2469,6 +2484,12 @@ dependencies = [
|
|||||||
"spin 0.10.0",
|
"spin 0.10.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crc16"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "338089f42c427b86394a5ee60ff321da23a5c89c9d89514c829687b26359fcff"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crc32fast"
|
name = "crc32fast"
|
||||||
version = "1.5.0"
|
version = "1.5.0"
|
||||||
@@ -2792,7 +2813,7 @@ checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376"
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "deadpool"
|
name = "deadpool"
|
||||||
version = "0.12.3"
|
version = "0.12.3"
|
||||||
source = "git+https://github.com/modrinth/deadpool?rev=db5fb00b036ecc8fe5f18853c559b745ffe47bde#db5fb00b036ecc8fe5f18853c559b745ffe47bde"
|
source = "git+https://github.com/modrinth/deadpool?rev=c7209b086829572f368f1194aba54bdea8dc540b#c7209b086829572f368f1194aba54bdea8dc540b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deadpool-runtime",
|
"deadpool-runtime",
|
||||||
"num_cpus",
|
"num_cpus",
|
||||||
@@ -2802,8 +2823,8 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deadpool-redis"
|
name = "deadpool-redis"
|
||||||
version = "0.22.1"
|
version = "0.23.0"
|
||||||
source = "git+https://github.com/modrinth/deadpool?rev=db5fb00b036ecc8fe5f18853c559b745ffe47bde#db5fb00b036ecc8fe5f18853c559b745ffe47bde"
|
source = "git+https://github.com/modrinth/deadpool?rev=c7209b086829572f368f1194aba54bdea8dc540b#c7209b086829572f368f1194aba54bdea8dc540b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deadpool",
|
"deadpool",
|
||||||
"redis",
|
"redis",
|
||||||
@@ -2813,7 +2834,7 @@ dependencies = [
|
|||||||
[[package]]
|
[[package]]
|
||||||
name = "deadpool-runtime"
|
name = "deadpool-runtime"
|
||||||
version = "0.1.5"
|
version = "0.1.5"
|
||||||
source = "git+https://github.com/modrinth/deadpool?rev=db5fb00b036ecc8fe5f18853c559b745ffe47bde#db5fb00b036ecc8fe5f18853c559b745ffe47bde"
|
source = "git+https://github.com/modrinth/deadpool?rev=c7209b086829572f368f1194aba54bdea8dc540b#c7209b086829572f368f1194aba54bdea8dc540b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tokio",
|
"tokio",
|
||||||
]
|
]
|
||||||
@@ -3259,6 +3280,18 @@ version = "1.2.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
|
checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "embedded-io"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "embedded-io"
|
||||||
|
version = "0.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "encode_unicode"
|
name = "encode_unicode"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -3835,6 +3868,12 @@ version = "0.3.31"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
|
checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "futures-timer"
|
||||||
|
version = "3.0.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "af43fadb8a98512d547e37b4e92e0ced13e205c061b87b4623eff01d918d6968"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-util"
|
name = "futures-util"
|
||||||
version = "0.3.31"
|
version = "0.3.31"
|
||||||
@@ -4146,6 +4185,29 @@ dependencies = [
|
|||||||
"system-deps",
|
"system-deps",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "governor"
|
||||||
|
version = "0.10.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"dashmap",
|
||||||
|
"futures-sink",
|
||||||
|
"futures-timer",
|
||||||
|
"futures-util",
|
||||||
|
"getrandom 0.3.3",
|
||||||
|
"hashbrown 0.16.0",
|
||||||
|
"nonzero_ext",
|
||||||
|
"parking_lot",
|
||||||
|
"portable-atomic",
|
||||||
|
"quanta",
|
||||||
|
"rand 0.9.2",
|
||||||
|
"smallvec",
|
||||||
|
"spinning_top",
|
||||||
|
"web-time",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "group"
|
name = "group"
|
||||||
version = "0.13.0"
|
version = "0.13.0"
|
||||||
@@ -4744,7 +4806,7 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"socket2 0.6.1",
|
"socket2 0.5.10",
|
||||||
"system-configuration",
|
"system-configuration",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tower-service",
|
"tower-service",
|
||||||
@@ -5085,17 +5147,6 @@ dependencies = [
|
|||||||
"syn 2.0.106",
|
"syn 2.0.106",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "io-uring"
|
|
||||||
version = "0.7.12"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "4d09b98f7eace8982db770e4408e7470b028ce513ac28fecdc6bf4c30fe92b62"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags 2.9.4",
|
|
||||||
"cfg-if",
|
|
||||||
"libc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ipconfig"
|
name = "ipconfig"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
@@ -5420,7 +5471,6 @@ dependencies = [
|
|||||||
"color-thief",
|
"color-thief",
|
||||||
"const_format",
|
"const_format",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
"deadpool-redis",
|
|
||||||
"derive_more 2.1.1",
|
"derive_more 2.1.1",
|
||||||
"dotenv-build",
|
"dotenv-build",
|
||||||
"dotenvy",
|
"dotenvy",
|
||||||
@@ -5445,8 +5495,10 @@ dependencies = [
|
|||||||
"modrinth-util",
|
"modrinth-util",
|
||||||
"muralpay",
|
"muralpay",
|
||||||
"murmur2",
|
"murmur2",
|
||||||
|
"neverbounce",
|
||||||
"paste",
|
"paste",
|
||||||
"path-util",
|
"path-util",
|
||||||
|
"postcard",
|
||||||
"prometheus",
|
"prometheus",
|
||||||
"quick-xml 0.38.3",
|
"quick-xml 0.38.3",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
@@ -5487,6 +5539,7 @@ dependencies = [
|
|||||||
"webauthn-rs-proto",
|
"webauthn-rs-proto",
|
||||||
"webp",
|
"webp",
|
||||||
"woothee",
|
"woothee",
|
||||||
|
"xredis",
|
||||||
"yaserde",
|
"yaserde",
|
||||||
"zip 6.0.0",
|
"zip 6.0.0",
|
||||||
"zxcvbn",
|
"zxcvbn",
|
||||||
@@ -5552,7 +5605,7 @@ dependencies = [
|
|||||||
"quoted_printable",
|
"quoted_printable",
|
||||||
"rustls 0.23.32",
|
"rustls 0.23.32",
|
||||||
"rustls-native-certs 0.8.1",
|
"rustls-native-certs 0.8.1",
|
||||||
"socket2 0.6.1",
|
"socket2 0.6.5",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-rustls 0.26.4",
|
"tokio-rustls 0.26.4",
|
||||||
"url",
|
"url",
|
||||||
@@ -5590,9 +5643,9 @@ checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.177"
|
version = "0.2.186"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
|
checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libfuzzer-sys"
|
name = "libfuzzer-sys"
|
||||||
@@ -6006,14 +6059,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mio"
|
name = "mio"
|
||||||
version = "1.0.4"
|
version = "1.2.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
|
checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"wasi 0.11.1+wasi-snapshot-preview1",
|
"wasi 0.11.1+wasi-snapshot-preview1",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -6224,6 +6277,14 @@ dependencies = [
|
|||||||
"jni-sys",
|
"jni-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "neverbounce"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"reqwest 0.12.24",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "new_debug_unreachable"
|
name = "new_debug_unreachable"
|
||||||
version = "1.0.6"
|
version = "1.0.6"
|
||||||
@@ -6268,6 +6329,12 @@ dependencies = [
|
|||||||
"memchr",
|
"memchr",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "nonzero_ext"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "noop_proc_macro"
|
name = "noop_proc_macro"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
@@ -7492,6 +7559,18 @@ version = "1.11.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
|
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "postcard"
|
||||||
|
version = "1.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24"
|
||||||
|
dependencies = [
|
||||||
|
"cobs",
|
||||||
|
"embedded-io 0.4.0",
|
||||||
|
"embedded-io 0.6.1",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "potential_utf"
|
name = "potential_utf"
|
||||||
version = "0.1.3"
|
version = "0.1.3"
|
||||||
@@ -7856,6 +7935,21 @@ dependencies = [
|
|||||||
"bytemuck",
|
"bytemuck",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quanta"
|
||||||
|
version = "0.12.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7"
|
||||||
|
dependencies = [
|
||||||
|
"crossbeam-utils",
|
||||||
|
"libc",
|
||||||
|
"once_cell",
|
||||||
|
"raw-cpuid",
|
||||||
|
"wasi 0.11.1+wasi-snapshot-preview1",
|
||||||
|
"web-sys",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "quartz_nbt"
|
name = "quartz_nbt"
|
||||||
version = "0.2.9"
|
version = "0.2.9"
|
||||||
@@ -7920,7 +8014,7 @@ dependencies = [
|
|||||||
"quinn-udp",
|
"quinn-udp",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
"rustls 0.23.32",
|
"rustls 0.23.32",
|
||||||
"socket2 0.6.1",
|
"socket2 0.5.10",
|
||||||
"thiserror 2.0.17",
|
"thiserror 2.0.17",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tracing",
|
"tracing",
|
||||||
@@ -7957,7 +8051,7 @@ dependencies = [
|
|||||||
"cfg_aliases",
|
"cfg_aliases",
|
||||||
"libc",
|
"libc",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"socket2 0.6.1",
|
"socket2 0.5.10",
|
||||||
"tracing",
|
"tracing",
|
||||||
"windows-sys 0.60.2",
|
"windows-sys 0.60.2",
|
||||||
]
|
]
|
||||||
@@ -8183,6 +8277,15 @@ dependencies = [
|
|||||||
"rgb",
|
"rgb",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "raw-cpuid"
|
||||||
|
version = "11.6.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags 2.9.4",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "raw-window-handle"
|
name = "raw-window-handle"
|
||||||
version = "0.6.2"
|
version = "0.6.2"
|
||||||
@@ -8242,26 +8345,32 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redis"
|
name = "redis"
|
||||||
version = "0.32.7"
|
version = "1.4.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "014cc767fefab6a3e798ca45112bccad9c6e0e218fbd49720042716c73cfef44"
|
checksum = "b0b9503711b03773e43b31668c7b5bd279ee7cd9b7d18cff7c23a42cc1d08e5a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash 0.8.12",
|
"ahash 0.8.12",
|
||||||
|
"arcstr",
|
||||||
|
"async-lock",
|
||||||
"bytes",
|
"bytes",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"combine",
|
"combine",
|
||||||
|
"crc16",
|
||||||
"futures-util",
|
"futures-util",
|
||||||
"itoa",
|
"itoa",
|
||||||
|
"log",
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"r2d2",
|
"r2d2",
|
||||||
|
"rand 0.10.1",
|
||||||
"ryu",
|
"ryu",
|
||||||
"sha1_smol",
|
"sha1_smol",
|
||||||
"socket2 0.6.1",
|
"socket2 0.6.5",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util",
|
"tokio-util",
|
||||||
"url",
|
"url",
|
||||||
|
"xxhash-rust",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -9714,12 +9823,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "socket2"
|
name = "socket2"
|
||||||
version = "0.6.1"
|
version = "0.6.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
|
checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"windows-sys 0.60.2",
|
"windows-sys 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -9794,6 +9903,15 @@ version = "0.10.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591"
|
checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spinning_top"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300"
|
||||||
|
dependencies = [
|
||||||
|
"lock_api",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spki"
|
name = "spki"
|
||||||
version = "0.7.3"
|
version = "0.7.3"
|
||||||
@@ -10896,8 +11014,10 @@ dependencies = [
|
|||||||
"fs4",
|
"fs4",
|
||||||
"futures",
|
"futures",
|
||||||
"futures-lite 2.6.1",
|
"futures-lite 2.6.1",
|
||||||
|
"governor",
|
||||||
"heck 0.5.0",
|
"heck 0.5.0",
|
||||||
"hickory-resolver 0.25.2",
|
"hickory-resolver 0.25.2",
|
||||||
|
"httpdate",
|
||||||
"indicatif",
|
"indicatif",
|
||||||
"itertools 0.14.0",
|
"itertools 0.14.0",
|
||||||
"modrinth-content-management",
|
"modrinth-content-management",
|
||||||
@@ -11158,30 +11278,27 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.47.1"
|
version = "1.53.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038"
|
checksum = "d988bcd52dbe076d3d46903332f58c912b87a2c49b1428419a5845154762ffee"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace",
|
|
||||||
"bytes",
|
"bytes",
|
||||||
"io-uring",
|
|
||||||
"libc",
|
"libc",
|
||||||
"mio",
|
"mio",
|
||||||
"parking_lot",
|
"parking_lot",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"signal-hook-registry",
|
"signal-hook-registry",
|
||||||
"slab",
|
"socket2 0.6.5",
|
||||||
"socket2 0.6.1",
|
|
||||||
"tokio-macros",
|
"tokio-macros",
|
||||||
"tracing",
|
"tracing",
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.61.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-macros"
|
name = "tokio-macros"
|
||||||
version = "2.5.0"
|
version = "2.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
|
checksum = "6328af13490e73a9b4694030fafd93f8c8c6a9dede33e821c3fc63eddf8042ba"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@@ -11385,7 +11502,7 @@ dependencies = [
|
|||||||
"hyper-util",
|
"hyper-util",
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
"pin-project",
|
"pin-project",
|
||||||
"socket2 0.6.1",
|
"socket2 0.6.5",
|
||||||
"sync_wrapper",
|
"sync_wrapper",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-stream",
|
"tokio-stream",
|
||||||
@@ -13315,6 +13432,31 @@ version = "0.13.6"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
|
checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xredis"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"ariadne",
|
||||||
|
"chrono",
|
||||||
|
"dashmap",
|
||||||
|
"deadpool-redis",
|
||||||
|
"futures",
|
||||||
|
"lz4_flex",
|
||||||
|
"prometheus",
|
||||||
|
"redis",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
|
"thiserror 2.0.17",
|
||||||
|
"tokio",
|
||||||
|
"tracing",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xxhash-rust"
|
||||||
|
version = "0.8.17"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "985eec839aaf2a1270af8f4ebcf63cf9401cfd90f0902f97c28d9f104ffbde72"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yaserde"
|
name = "yaserde"
|
||||||
version = "0.12.0"
|
version = "0.12.0"
|
||||||
|
|||||||
+15
-2
@@ -13,7 +13,9 @@ members = [
|
|||||||
"packages/modrinth-log",
|
"packages/modrinth-log",
|
||||||
"packages/modrinth-maxmind",
|
"packages/modrinth-maxmind",
|
||||||
"packages/modrinth-util",
|
"packages/modrinth-util",
|
||||||
|
"packages/neverbounce",
|
||||||
"packages/path-util",
|
"packages/path-util",
|
||||||
|
"packages/xredis",
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
@@ -71,7 +73,7 @@ daedalus = { path = "packages/daedalus" }
|
|||||||
darling = { version = "0.23" }
|
darling = { version = "0.23" }
|
||||||
dashmap = "6.1.0"
|
dashmap = "6.1.0"
|
||||||
data-url = "0.3.2"
|
data-url = "0.3.2"
|
||||||
deadpool-redis = { git = "https://github.com/modrinth/deadpool", rev = "db5fb00b036ecc8fe5f18853c559b745ffe47bde", version = "0.22.1" }
|
deadpool-redis = { git = "https://github.com/modrinth/deadpool", rev = "c7209b086829572f368f1194aba54bdea8dc540b", version = "0.23.0" }
|
||||||
derive_more = "2.1.1"
|
derive_more = "2.1.1"
|
||||||
directories = "6.0.0"
|
directories = "6.0.0"
|
||||||
dirs = "6.0.0"
|
dirs = "6.0.0"
|
||||||
@@ -88,10 +90,12 @@ fs4 = { version = "0.13.1", default-features = false }
|
|||||||
futures = "0.3.31"
|
futures = "0.3.31"
|
||||||
futures-lite = "2.6.1"
|
futures-lite = "2.6.1"
|
||||||
futures-util = "0.3.31"
|
futures-util = "0.3.31"
|
||||||
|
governor = "0.10.4"
|
||||||
heck = "0.5.0"
|
heck = "0.5.0"
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
hickory-resolver = "0.25.2"
|
hickory-resolver = "0.25.2"
|
||||||
hmac = "0.12.1"
|
hmac = "0.12.1"
|
||||||
|
httpdate = "1.0.3"
|
||||||
hyper = "1.7.0"
|
hyper = "1.7.0"
|
||||||
hyper-rustls = { version = "0.27.7", default-features = false, features = [
|
hyper-rustls = { version = "0.27.7", default-features = false, features = [
|
||||||
"aws-lc-rs",
|
"aws-lc-rs",
|
||||||
@@ -118,6 +122,12 @@ lettre = { version = "0.11.19", default-features = false, features = [
|
|||||||
"tokio1",
|
"tokio1",
|
||||||
"tokio1-rustls",
|
"tokio1-rustls",
|
||||||
] }
|
] }
|
||||||
|
lz4_flex = { version = "0.11.5", default-features = false, features = [
|
||||||
|
"checked-decode",
|
||||||
|
"safe-decode",
|
||||||
|
"safe-encode",
|
||||||
|
"std",
|
||||||
|
] }
|
||||||
maxminddb = "0.26.0"
|
maxminddb = "0.26.0"
|
||||||
meilisearch-sdk = { version = "0.30.0", default-features = false }
|
meilisearch-sdk = { version = "0.30.0", default-features = false }
|
||||||
modrinth-content-management = { path = "packages/modrinth-content-management" }
|
modrinth-content-management = { path = "packages/modrinth-content-management" }
|
||||||
@@ -126,6 +136,7 @@ modrinth-util = { path = "packages/modrinth-util" }
|
|||||||
muralpay = { path = "packages/muralpay" }
|
muralpay = { path = "packages/muralpay" }
|
||||||
murmur2 = "0.1.0"
|
murmur2 = "0.1.0"
|
||||||
native-dialog = "0.9.2"
|
native-dialog = "0.9.2"
|
||||||
|
neverbounce = { path = "packages/neverbounce" }
|
||||||
notify = { version = "8.2.0", default-features = false }
|
notify = { version = "8.2.0", default-features = false }
|
||||||
notify-debouncer-mini = { version = "0.7.0", default-features = false }
|
notify-debouncer-mini = { version = "0.7.0", default-features = false }
|
||||||
objc2-app-kit = { version = "0.3.2", default-features = false }
|
objc2-app-kit = { version = "0.3.2", default-features = false }
|
||||||
@@ -135,6 +146,7 @@ paste = "1.0.15"
|
|||||||
path-util = { path = "packages/path-util" }
|
path-util = { path = "packages/path-util" }
|
||||||
phf = { version = "0.13.1", features = ["macros"] }
|
phf = { version = "0.13.1", features = ["macros"] }
|
||||||
png = "0.18.0"
|
png = "0.18.0"
|
||||||
|
postcard = { version = "1.1.3", default-features = false, features = ["alloc"] }
|
||||||
proc-macro2 = { version = "1.0" }
|
proc-macro2 = { version = "1.0" }
|
||||||
prometheus = "0.14.0"
|
prometheus = "0.14.0"
|
||||||
quartz_nbt = "0.2.9"
|
quartz_nbt = "0.2.9"
|
||||||
@@ -143,7 +155,7 @@ quote = { version = "1.0" }
|
|||||||
rand = "=0.8.5" # Locked on 0.8 until argon2 and p256 update to 0.9
|
rand = "=0.8.5" # Locked on 0.8 until argon2 and p256 update to 0.9
|
||||||
rand_chacha = "=0.3.1" # Locked on 0.3 until we can update rand to 0.9
|
rand_chacha = "=0.3.1" # Locked on 0.3 until we can update rand to 0.9
|
||||||
rdkafka = { version = "0.36.2", features = ["cmake-build"] }
|
rdkafka = { version = "0.36.2", features = ["cmake-build"] }
|
||||||
redis = "0.32.7"
|
redis = "1.4.1"
|
||||||
regex = "1.12.2"
|
regex = "1.12.2"
|
||||||
reqwest = { version = "0.12.24", default-features = false }
|
reqwest = { version = "0.12.24", default-features = false }
|
||||||
rgb = "0.8.52"
|
rgb = "0.8.52"
|
||||||
@@ -230,6 +242,7 @@ windows = "=0.61.3" # Locked on 0.61 until we can update windows-core to 0.62
|
|||||||
windows-core = "=0.61.2" # Locked on 0.61 until webview2-com updates to 0.62
|
windows-core = "=0.61.2" # Locked on 0.61 until webview2-com updates to 0.62
|
||||||
winreg = "0.55.0"
|
winreg = "0.55.0"
|
||||||
woothee = "0.13.0"
|
woothee = "0.13.0"
|
||||||
|
xredis = { path = "packages/xredis" }
|
||||||
yaserde = "0.12.0"
|
yaserde = "0.12.0"
|
||||||
zbus = "5.11.0"
|
zbus = "5.11.0"
|
||||||
zip = { version = "6.0.0", default-features = false, features = [
|
zip = { version = "6.0.0", default-features = false, features = [
|
||||||
|
|||||||
@@ -8,8 +8,11 @@ extend-exclude = [
|
|||||||
"packages/blog/",
|
"packages/blog/",
|
||||||
# contains licenses like `CC-BY-ND-4.0`
|
# contains licenses like `CC-BY-ND-4.0`
|
||||||
"packages/moderation/src/data/stages/license.ts",
|
"packages/moderation/src/data/stages/license.ts",
|
||||||
|
"packages/moderation/src/utils.ts",
|
||||||
# contains payment card IDs like `IY1VMST1MOXS` which are flagged
|
# contains payment card IDs like `IY1VMST1MOXS` which are flagged
|
||||||
"apps/labrinth/src/queue/payouts/mod.rs",
|
"apps/labrinth/src/queue/payouts/mod.rs",
|
||||||
|
# contains domain names with deliberate typos
|
||||||
|
"apps/labrinth/assets/disposable_email_blocklist.txt"
|
||||||
]
|
]
|
||||||
|
|
||||||
[default.extend-words]
|
[default.extend-words]
|
||||||
|
|||||||
+239
-60
@@ -76,27 +76,41 @@ import FriendsList from '@/components/ui/friends/FriendsList.vue'
|
|||||||
import AddServerToInstanceModal from '@/components/ui/install_flow/AddServerToInstanceModal.vue'
|
import AddServerToInstanceModal from '@/components/ui/install_flow/AddServerToInstanceModal.vue'
|
||||||
import UnknownPackWarningModal from '@/components/ui/install_flow/UnknownPackWarningModal.vue'
|
import UnknownPackWarningModal from '@/components/ui/install_flow/UnknownPackWarningModal.vue'
|
||||||
import MinecraftAuthErrorModal from '@/components/ui/minecraft-auth-error-modal/MinecraftAuthErrorModal.vue'
|
import MinecraftAuthErrorModal from '@/components/ui/minecraft-auth-error-modal/MinecraftAuthErrorModal.vue'
|
||||||
|
import MinecraftRequiredModal from '@/components/ui/minecraft-required-modal/MinecraftRequiredModal.vue'
|
||||||
import AppSettingsModal from '@/components/ui/modal/AppSettingsModal.vue'
|
import AppSettingsModal from '@/components/ui/modal/AppSettingsModal.vue'
|
||||||
import AuthGrantFlowWaitModal from '@/components/ui/modal/AuthGrantFlowWaitModal.vue'
|
|
||||||
import InstallToPlayModal from '@/components/ui/modal/InstallToPlayModal.vue'
|
import InstallToPlayModal from '@/components/ui/modal/InstallToPlayModal.vue'
|
||||||
import ModpackAlreadyInstalledModal from '@/components/ui/modal/ModpackAlreadyInstalledModal.vue'
|
import ModpackAlreadyInstalledModal from '@/components/ui/modal/ModpackAlreadyInstalledModal.vue'
|
||||||
|
import ModrinthAccountRequiredModal from '@/components/ui/modal/ModrinthAccountRequiredModal.vue'
|
||||||
import UpdateToPlayModal from '@/components/ui/modal/UpdateToPlayModal.vue'
|
import UpdateToPlayModal from '@/components/ui/modal/UpdateToPlayModal.vue'
|
||||||
import NavButton from '@/components/ui/NavButton.vue'
|
import NavButton from '@/components/ui/NavButton.vue'
|
||||||
import PrideFundraiserBanner from '@/components/ui/PrideFundraiserBanner.vue'
|
import PrideFundraiserBanner from '@/components/ui/PrideFundraiserBanner.vue'
|
||||||
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
|
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
|
||||||
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
|
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
|
||||||
|
import SharedInstanceInviteHandler from '@/components/ui/shared-instances/shared-instance-invite-handler/index.vue'
|
||||||
import SplashScreen from '@/components/ui/SplashScreen.vue'
|
import SplashScreen from '@/components/ui/SplashScreen.vue'
|
||||||
import WindowControls from '@/components/ui/WindowControls.vue'
|
import WindowControls from '@/components/ui/WindowControls.vue'
|
||||||
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
|
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
|
||||||
import { config } from '@/config'
|
import { config } from '@/config'
|
||||||
import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads.js'
|
import {
|
||||||
|
ads_consent_listener,
|
||||||
|
hide_ads_window,
|
||||||
|
init_ads_window,
|
||||||
|
perform_ads_consent_action,
|
||||||
|
should_show_ads_consent_popup,
|
||||||
|
show_ads_window,
|
||||||
|
} from '@/helpers/ads.js'
|
||||||
import { debugAnalytics, initAnalytics, trackEvent } from '@/helpers/analytics'
|
import { debugAnalytics, initAnalytics, trackEvent } from '@/helpers/analytics'
|
||||||
import { check_reachable } from '@/helpers/auth.js'
|
import { check_reachable } from '@/helpers/auth.js'
|
||||||
import { get_user, get_version } from '@/helpers/cache.js'
|
import { get_user, get_version } from '@/helpers/cache.js'
|
||||||
import { command_listener, notification_listener, warning_listener } from '@/helpers/events.js'
|
import { command_listener, notification_listener, warning_listener } from '@/helpers/events.js'
|
||||||
import { install_create_modpack_instance, install_get_modpack_preview } from '@/helpers/install'
|
import { install_create_modpack_instance, install_get_modpack_preview } from '@/helpers/install'
|
||||||
import { list, run } from '@/helpers/instance'
|
import {
|
||||||
import { cancelLogin, get as getCreds, login, logout } from '@/helpers/mr_auth.ts'
|
can_current_user_use_shared_instances,
|
||||||
|
get as getInstance,
|
||||||
|
list,
|
||||||
|
run,
|
||||||
|
} from '@/helpers/instance'
|
||||||
|
import { get as getCreds, login, logout } from '@/helpers/mr_auth.ts'
|
||||||
import { mergeUrlQuery, parseModrinthLink } from '@/helpers/project-links.ts'
|
import { mergeUrlQuery, parseModrinthLink } from '@/helpers/project-links.ts'
|
||||||
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
|
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
|
||||||
import { get_opening_command, initialize_state } from '@/helpers/state'
|
import { get_opening_command, initialize_state } from '@/helpers/state'
|
||||||
@@ -147,6 +161,7 @@ const APP_SIDEBAR_WIDTH = 300
|
|||||||
const INTERCOM_BUBBLE_DEFAULT_PADDING = 20
|
const INTERCOM_BUBBLE_DEFAULT_PADDING = 20
|
||||||
const PRIDE_FUNDRAISER_END_DATE = new Date('2026-07-01T00:00:00Z').getTime()
|
const PRIDE_FUNDRAISER_END_DATE = new Date('2026-07-01T00:00:00Z').getTime()
|
||||||
const credentials = ref()
|
const credentials = ref()
|
||||||
|
let credentialsRefreshId = 0
|
||||||
const sidebarToggled = ref(true)
|
const sidebarToggled = ref(true)
|
||||||
const unsubscribeSidebarToggle = themeStore.$subscribe(() => {
|
const unsubscribeSidebarToggle = themeStore.$subscribe(() => {
|
||||||
sidebarToggled.value = !themeStore.toggleSidebar
|
sidebarToggled.value = !themeStore.toggleSidebar
|
||||||
@@ -184,12 +199,15 @@ const { handleError, addNotification } = notificationManager
|
|||||||
const popupNotificationManager = new AppPopupNotificationManager()
|
const popupNotificationManager = new AppPopupNotificationManager()
|
||||||
providePopupNotificationManager(popupNotificationManager)
|
providePopupNotificationManager(popupNotificationManager)
|
||||||
const { addPopupNotification } = popupNotificationManager
|
const { addPopupNotification } = popupNotificationManager
|
||||||
|
let adsConsentPopupId = null
|
||||||
|
let unlistenAdsConsent
|
||||||
|
|
||||||
const appVersion = getVersion()
|
const appVersion = getVersion()
|
||||||
const tauriApiClient = new TauriModrinthClient({
|
const tauriApiClient = new TauriModrinthClient({
|
||||||
userAgent: async () => `modrinth/theseus/${await appVersion} (support@modrinth.com)`,
|
userAgent: async () => `modrinth/theseus/${await appVersion} (support@modrinth.com)`,
|
||||||
labrinthBaseUrl: config.labrinthBaseUrl,
|
labrinthBaseUrl: config.labrinthBaseUrl,
|
||||||
archonBaseUrl: config.archonBaseUrl,
|
archonBaseUrl: config.archonBaseUrl,
|
||||||
|
sharedInstancesBaseUrl: config.sharedInstancesBaseUrl,
|
||||||
features: [
|
features: [
|
||||||
new NodeAuthFeature({
|
new NodeAuthFeature({
|
||||||
getAuth: () => nodeAuthState.getAuth?.() ?? null,
|
getAuth: () => nodeAuthState.getAuth?.() ?? null,
|
||||||
@@ -213,9 +231,30 @@ const { data: authenticatedModrinthUser } = useQuery({
|
|||||||
enabled: () => !!credentials.value?.session,
|
enabled: () => !!credentials.value?.session,
|
||||||
retry: false,
|
retry: false,
|
||||||
})
|
})
|
||||||
|
useQuery({
|
||||||
|
queryKey: computed(() => ['shared-instance-eligibility', credentials.value?.user?.id]),
|
||||||
|
queryFn: can_current_user_use_shared_instances,
|
||||||
|
enabled: () => !!credentials.value?.session && !!credentials.value?.user?.id,
|
||||||
|
retry: false,
|
||||||
|
staleTime: Infinity,
|
||||||
|
refetchOnMount: false,
|
||||||
|
refetchOnWindowFocus: false,
|
||||||
|
refetchOnReconnect: false,
|
||||||
|
})
|
||||||
|
const hasPlus = computed(
|
||||||
|
() =>
|
||||||
|
!!credentials.value?.user &&
|
||||||
|
(hasMidasBadge(credentials.value.user) ||
|
||||||
|
hasActivePride26Midas(authenticatedModrinthUser.value?.campaigns?.pride_26)),
|
||||||
|
)
|
||||||
|
const showAd = computed(
|
||||||
|
() => sidebarVisible.value && !hasPlus.value && credentials.value !== undefined,
|
||||||
|
)
|
||||||
|
const adConsentAvailable = computed(() => credentials.value !== undefined && !hasPlus.value)
|
||||||
providePageContext({
|
providePageContext({
|
||||||
hierarchicalSidebarAvailable: ref(true),
|
hierarchicalSidebarAvailable: ref(true),
|
||||||
showAds: ref(false),
|
showAds: showAd,
|
||||||
|
adConsentAvailable,
|
||||||
floatingActionBarOffsets: {
|
floatingActionBarOffsets: {
|
||||||
left: ref(APP_LEFT_NAV_WIDTH),
|
left: ref(APP_LEFT_NAV_WIDTH),
|
||||||
right: computed(() => (sidebarVisible.value ? `${APP_SIDEBAR_WIDTH}px` : '0px')),
|
right: computed(() => (sidebarVisible.value ? `${APP_SIDEBAR_WIDTH}px` : '0px')),
|
||||||
@@ -251,6 +290,9 @@ const {
|
|||||||
const news = ref([])
|
const news = ref([])
|
||||||
const availableSurvey = ref(false)
|
const availableSurvey = ref(false)
|
||||||
const displayedServerInviteNotifications = new Set()
|
const displayedServerInviteNotifications = new Set()
|
||||||
|
const serverInvitePopupNotificationIds = new Set()
|
||||||
|
let liveNotificationGeneration = 0
|
||||||
|
let liveNotificationsEnabled = true
|
||||||
|
|
||||||
const offline = ref(!navigator.onLine)
|
const offline = ref(!navigator.onLine)
|
||||||
window.addEventListener('offline', () => {
|
window.addEventListener('offline', () => {
|
||||||
@@ -295,6 +337,12 @@ const authUnreachable = computed(() => {
|
|||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await useCheckDisableMouseover()
|
await useCheckDisableMouseover()
|
||||||
|
try {
|
||||||
|
unlistenAdsConsent = await ads_consent_listener(handleAdsConsentRequired)
|
||||||
|
handleAdsConsentRequired(await should_show_ads_consent_popup())
|
||||||
|
} catch (error) {
|
||||||
|
handleError(error)
|
||||||
|
}
|
||||||
|
|
||||||
document.querySelector('body').addEventListener('click', handleClick)
|
document.querySelector('body').addEventListener('click', handleClick)
|
||||||
document.querySelector('body').addEventListener('auxclick', handleAuxClick)
|
document.querySelector('body').addEventListener('auxclick', handleAuxClick)
|
||||||
@@ -308,6 +356,7 @@ onUnmounted(async () => {
|
|||||||
unsubscribeSidebarToggle()
|
unsubscribeSidebarToggle()
|
||||||
clearDelayedUpdatePopup()
|
clearDelayedUpdatePopup()
|
||||||
|
|
||||||
|
await unlistenAdsConsent?.()
|
||||||
await unlistenUpdateDownload?.()
|
await unlistenUpdateDownload?.()
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -332,8 +381,77 @@ const messages = defineMessages({
|
|||||||
defaultMessage:
|
defaultMessage:
|
||||||
'Minecraft authentication servers may be down right now. Check your internet connection and try again later.',
|
'Minecraft authentication servers may be down right now. Check your internet connection and try again later.',
|
||||||
},
|
},
|
||||||
|
adsConsentTitle: {
|
||||||
|
id: 'app.ads-consent.title',
|
||||||
|
defaultMessage: 'Your privacy and how ads support Modrinth',
|
||||||
|
},
|
||||||
|
adsConsentBody: {
|
||||||
|
id: 'app.ads-consent.body',
|
||||||
|
defaultMessage:
|
||||||
|
'Ads make Modrinth possible and fund creator payouts. Our partners may store or access cookies in the app to personalize ads and measure performance.',
|
||||||
|
},
|
||||||
|
adsConsentManage: {
|
||||||
|
id: 'app.ads-consent.manage',
|
||||||
|
defaultMessage: 'Manage preferences',
|
||||||
|
},
|
||||||
|
adsConsentReject: {
|
||||||
|
id: 'app.ads-consent.reject',
|
||||||
|
defaultMessage: 'Reject all',
|
||||||
|
},
|
||||||
|
adsConsentAccept: {
|
||||||
|
id: 'app.ads-consent.accept',
|
||||||
|
defaultMessage: 'Accept all',
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function handleAdsConsentRequired(required) {
|
||||||
|
if (!required) {
|
||||||
|
if (adsConsentPopupId !== null) {
|
||||||
|
popupNotificationManager.removeNotification(adsConsentPopupId)
|
||||||
|
adsConsentPopupId = null
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
adsConsentPopupId !== null &&
|
||||||
|
popupNotificationManager.getNotifications().some((item) => item.id === adsConsentPopupId)
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const notification = addPopupNotification({
|
||||||
|
title: formatMessage(messages.adsConsentTitle),
|
||||||
|
text: formatMessage(messages.adsConsentBody),
|
||||||
|
type: 'info',
|
||||||
|
hideIcon: true,
|
||||||
|
autoCloseMs: null,
|
||||||
|
dismissible: false,
|
||||||
|
buttons: [
|
||||||
|
{
|
||||||
|
label: formatMessage(messages.adsConsentManage),
|
||||||
|
action: () => perform_ads_consent_action('manage').catch(handleError),
|
||||||
|
color: 'standard',
|
||||||
|
keepOpen: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: formatMessage(messages.adsConsentReject),
|
||||||
|
action: () => perform_ads_consent_action('reject').catch(handleError),
|
||||||
|
color: 'brand',
|
||||||
|
keepOpen: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: formatMessage(messages.adsConsentAccept),
|
||||||
|
action: () => perform_ads_consent_action('accept').catch(handleError),
|
||||||
|
color: 'brand',
|
||||||
|
keepOpen: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
|
||||||
|
adsConsentPopupId = notification.id
|
||||||
|
}
|
||||||
|
|
||||||
async function setupApp() {
|
async function setupApp() {
|
||||||
const {
|
const {
|
||||||
native_decorations,
|
native_decorations,
|
||||||
@@ -403,7 +521,7 @@ async function setupApp() {
|
|||||||
addNotification({
|
addNotification({
|
||||||
title: 'Warning',
|
title: 'Warning',
|
||||||
text: e.message,
|
text: e.message,
|
||||||
type: 'warn',
|
type: 'warning',
|
||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -588,6 +706,7 @@ watch(stateInitialized, (ready) => {
|
|||||||
const error = useError()
|
const error = useError()
|
||||||
const errorModal = ref()
|
const errorModal = ref()
|
||||||
const minecraftAuthErrorModal = ref()
|
const minecraftAuthErrorModal = ref()
|
||||||
|
const minecraftRequiredModal = ref()
|
||||||
|
|
||||||
const contentInstall = createContentInstall({ router, handleError })
|
const contentInstall = createContentInstall({ router, handleError })
|
||||||
provideContentInstall(contentInstall)
|
provideContentInstall(contentInstall)
|
||||||
@@ -637,9 +756,10 @@ const contentInstallModpackAlreadyInstalledModal = ref()
|
|||||||
const addServerToInstanceModal = ref()
|
const addServerToInstanceModal = ref()
|
||||||
const incompatibilityWarningModal = ref()
|
const incompatibilityWarningModal = ref()
|
||||||
const installToPlayModal = ref()
|
const installToPlayModal = ref()
|
||||||
|
const sharedInstanceInviteHandler = ref()
|
||||||
const updateToPlayModal = ref()
|
const updateToPlayModal = ref()
|
||||||
|
|
||||||
const modrinthLoginFlowWaitModal = ref()
|
const modrinthLoginModal = ref()
|
||||||
|
|
||||||
watch(incompatibilityWarningModal, (modal) => {
|
watch(incompatibilityWarningModal, (modal) => {
|
||||||
if (modal) {
|
if (modal) {
|
||||||
@@ -647,8 +767,12 @@ watch(incompatibilityWarningModal, (modal) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
setupAuthProvider(credentials, async (_redirectPath) => {
|
setupAuthProvider(credentials, async (_redirectPath, flow, options) => {
|
||||||
await signIn()
|
if (options?.showModal === false) {
|
||||||
|
await signIn(flow)
|
||||||
|
} else {
|
||||||
|
await requestSignIn(flow)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
async function validateSession(sessionToken) {
|
async function validateSession(sessionToken) {
|
||||||
@@ -665,23 +789,35 @@ async function validateSession(sessionToken) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function fetchCredentials() {
|
async function fetchCredentials() {
|
||||||
|
const hadSession = !!credentials.value?.session
|
||||||
|
const refreshId = ++credentialsRefreshId
|
||||||
|
credentials.value = undefined
|
||||||
|
|
||||||
const creds = await getCreds().catch(handleError)
|
const creds = await getCreds().catch(handleError)
|
||||||
|
if (refreshId !== credentialsRefreshId) return
|
||||||
|
if (!creds && hadSession) clearLiveNotifications()
|
||||||
|
|
||||||
if (creds && creds.user_id) {
|
if (creds && creds.user_id) {
|
||||||
if (creds.session && !(await validateSession(creds.session))) {
|
if (creds.session && !(await validateSession(creds.session))) {
|
||||||
|
if (refreshId !== credentialsRefreshId) return
|
||||||
|
|
||||||
|
clearLiveNotifications()
|
||||||
await logout().catch(handleError)
|
await logout().catch(handleError)
|
||||||
|
if (refreshId !== credentialsRefreshId) return
|
||||||
|
|
||||||
credentials.value = null
|
credentials.value = null
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
creds.user = await get_user(creds.user_id, 'bypass').catch(handleError)
|
creds.user = await get_user(creds.user_id, 'bypass').catch(handleError)
|
||||||
|
if (refreshId !== credentialsRefreshId) return
|
||||||
}
|
}
|
||||||
credentials.value = creds ?? null
|
credentials.value = creds ?? null
|
||||||
|
liveNotificationsEnabled = !!creds?.session
|
||||||
}
|
}
|
||||||
|
|
||||||
async function signIn() {
|
async function signIn(flow = 'sign-in') {
|
||||||
modrinthLoginFlowWaitModal.value.show()
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await login()
|
await login(flow)
|
||||||
await fetchCredentials()
|
await fetchCredentials()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (
|
if (
|
||||||
@@ -693,27 +829,31 @@ async function signIn() {
|
|||||||
} else {
|
} else {
|
||||||
handleError(error)
|
handleError(error)
|
||||||
}
|
}
|
||||||
} finally {
|
|
||||||
modrinthLoginFlowWaitModal.value.hide()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function requestSignIn(flow = 'sign-in') {
|
||||||
|
await modrinthLoginModal.value?.showSigningIn(flow)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function requestModrinthAuth(flow = 'sign-in') {
|
||||||
|
await signIn(flow)
|
||||||
|
return !!credentials.value?.session
|
||||||
|
}
|
||||||
|
|
||||||
async function logOut() {
|
async function logOut() {
|
||||||
|
await performLogOut()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function performLogOut() {
|
||||||
|
credentialsRefreshId++
|
||||||
|
credentials.value = undefined
|
||||||
|
clearLiveNotifications()
|
||||||
|
|
||||||
await logout().catch(handleError)
|
await logout().catch(handleError)
|
||||||
await fetchCredentials()
|
await fetchCredentials()
|
||||||
}
|
}
|
||||||
|
|
||||||
const hasPlus = computed(
|
|
||||||
() =>
|
|
||||||
!!credentials.value?.user &&
|
|
||||||
(hasMidasBadge(credentials.value.user) ||
|
|
||||||
hasActivePride26Midas(authenticatedModrinthUser.value?.campaigns?.pride_26)),
|
|
||||||
)
|
|
||||||
|
|
||||||
const showAd = computed(
|
|
||||||
() => sidebarVisible.value && !hasPlus.value && credentials.value !== undefined,
|
|
||||||
)
|
|
||||||
|
|
||||||
async function fetchIntercomToken() {
|
async function fetchIntercomToken() {
|
||||||
const creds = await getCreds()
|
const creds = await getCreds()
|
||||||
if (!creds?.session) {
|
if (!creds?.session) {
|
||||||
@@ -740,19 +880,28 @@ async function fetchIntercomToken() {
|
|||||||
return await response.json()
|
return await response.json()
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(showAd, () => {
|
watch(
|
||||||
if (!showAd.value) {
|
[showAd, adConsentAvailable],
|
||||||
hide_ads_window(true)
|
async ([showAds, canManageConsent]) => {
|
||||||
} else {
|
if (showAds) {
|
||||||
init_ads_window(true)
|
await init_ads_window(true)
|
||||||
}
|
return
|
||||||
})
|
}
|
||||||
|
|
||||||
|
await hide_ads_window(true)
|
||||||
|
if (canManageConsent) {
|
||||||
|
await init_ads_window()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
invoke('show_window')
|
invoke('show_window')
|
||||||
|
|
||||||
error.setErrorModal(errorModal.value)
|
error.setErrorModal(errorModal.value)
|
||||||
error.setMinecraftAuthErrorModal(minecraftAuthErrorModal.value)
|
error.setMinecraftAuthErrorModal(minecraftAuthErrorModal.value)
|
||||||
|
error.setMinecraftRequiredModal(minecraftRequiredModal.value)
|
||||||
|
|
||||||
setContentIncompatibilityWarningModal(incompatibilityWarningModal.value)
|
setContentIncompatibilityWarningModal(incompatibilityWarningModal.value)
|
||||||
setContentInstallModal(modInstallModal.value)
|
setContentInstallModal(modInstallModal.value)
|
||||||
@@ -821,30 +970,48 @@ function openServerInviteInviterProfile(inviterName) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleLiveNotification(notification) {
|
async function handleLiveNotification(notification) {
|
||||||
if (notification?.body?.type !== 'server_invite' || notification.read) return
|
if (!liveNotificationsEnabled || !notification?.body || notification.read) return
|
||||||
if (displayedServerInviteNotifications.has(notification.id)) return
|
if (await sharedInstanceInviteHandler.value?.handleNotification(notification)) return
|
||||||
|
|
||||||
displayedServerInviteNotifications.add(notification.id)
|
if (notification.body.type === 'server_invite') {
|
||||||
|
if (displayedServerInviteNotifications.has(notification.id)) return
|
||||||
|
|
||||||
const serverName =
|
const generation = liveNotificationGeneration
|
||||||
typeof notification.body.server_name === 'string' ? notification.body.server_name : 'a server'
|
displayedServerInviteNotifications.add(notification.id)
|
||||||
const inviterId = notification.body.invited_by
|
|
||||||
const invitedBy =
|
|
||||||
typeof inviterId === 'string' ? await get_user(inviterId, 'bypass').catch(() => null) : null
|
|
||||||
|
|
||||||
addPopupNotification({
|
const serverName =
|
||||||
title: serverName,
|
typeof notification.body.server_name === 'string' ? notification.body.server_name : 'a server'
|
||||||
autoCloseMs: null,
|
const inviterId = notification.body.invited_by
|
||||||
toast: {
|
const invitedBy =
|
||||||
type: 'server-invite',
|
typeof inviterId === 'string' ? await get_user(inviterId, 'bypass').catch(() => null) : null
|
||||||
actorName: invitedBy?.username ?? null,
|
if (generation !== liveNotificationGeneration) return
|
||||||
actorAvatarUrl: invitedBy?.avatar_url ?? null,
|
|
||||||
entityName: serverName,
|
const popupNotification = addPopupNotification({
|
||||||
onAccept: () => acceptServerInviteNotification(notification),
|
title: serverName,
|
||||||
onDecline: () => declineServerInviteNotification(notification),
|
autoCloseMs: null,
|
||||||
onOpenActor: () => openServerInviteInviterProfile(invitedBy?.username ?? null),
|
toast: {
|
||||||
},
|
type: 'server-invite',
|
||||||
})
|
actorName: invitedBy?.username ?? null,
|
||||||
|
actorAvatarUrl: invitedBy?.avatar_url ?? null,
|
||||||
|
entityName: serverName,
|
||||||
|
onAccept: () => acceptServerInviteNotification(notification),
|
||||||
|
onDecline: () => declineServerInviteNotification(notification),
|
||||||
|
onOpenActor: () => openServerInviteInviterProfile(invitedBy?.username ?? null),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
serverInvitePopupNotificationIds.add(popupNotification.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearLiveNotifications() {
|
||||||
|
liveNotificationGeneration++
|
||||||
|
liveNotificationsEnabled = false
|
||||||
|
for (const id of serverInvitePopupNotificationIds) {
|
||||||
|
popupNotificationManager.removeNotification(id)
|
||||||
|
}
|
||||||
|
displayedServerInviteNotifications.clear()
|
||||||
|
serverInvitePopupNotificationIds.clear()
|
||||||
|
sharedInstanceInviteHandler.value?.clearNotifications()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleCommand(e) {
|
async function handleCommand(e) {
|
||||||
@@ -855,12 +1022,13 @@ async function handleCommand(e) {
|
|||||||
if (e.path.endsWith('.mrpack')) {
|
if (e.path.endsWith('.mrpack')) {
|
||||||
const location = { type: 'fromFile', path: e.path }
|
const location = { type: 'fromFile', path: e.path }
|
||||||
const preview = await install_get_modpack_preview(location).catch(handleError)
|
const preview = await install_get_modpack_preview(location).catch(handleError)
|
||||||
if (preview?.unknownFile) {
|
if (preview?.unknownFile || preview?.externalFilesInModpack.length > 0) {
|
||||||
const splitPath = e.path.split(/[\\/]/)
|
const splitPath = e.path.split(/[\\/]/)
|
||||||
const fileName = splitPath ? splitPath[splitPath.length - 1] : e.path
|
const fileName = splitPath ? splitPath[splitPath.length - 1] : e.path
|
||||||
unknownPackWarningModal.value?.show(
|
unknownPackWarningModal.value?.show(
|
||||||
() => install_create_modpack_instance(location).then(() => undefined),
|
() => install_create_modpack_instance(location).then(() => undefined),
|
||||||
fileName,
|
fileName,
|
||||||
|
preview.externalFilesInModpack,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
await install_create_modpack_instance(location).catch(handleError)
|
await install_create_modpack_instance(location).catch(handleError)
|
||||||
@@ -870,6 +1038,9 @@ async function handleCommand(e) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else if (e.event === 'LaunchInstance') {
|
} else if (e.event === 'LaunchInstance') {
|
||||||
|
const instance = await getInstance(e.id).catch(handleError)
|
||||||
|
if (!instance || instance.quarantined) return
|
||||||
|
|
||||||
if (e.server) {
|
if (e.server) {
|
||||||
await start_join_server(e.id, e.server).catch(handleError)
|
await start_join_server(e.id, e.server).catch(handleError)
|
||||||
} else if (e.singleplayer_world) {
|
} else if (e.singleplayer_world) {
|
||||||
@@ -877,6 +1048,8 @@ async function handleCommand(e) {
|
|||||||
} else {
|
} else {
|
||||||
await run(e.id).catch(handleError)
|
await run(e.id).catch(handleError)
|
||||||
}
|
}
|
||||||
|
} else if (e.event === 'InstallSharedInstanceInvite') {
|
||||||
|
await sharedInstanceInviteHandler.value?.installFromInviteId(e.invite_id)
|
||||||
} else if (e.event === 'InstallServer') {
|
} else if (e.event === 'InstallServer') {
|
||||||
await router.push(`/project/${e.id}`)
|
await router.push(`/project/${e.id}`)
|
||||||
await playServerProject(e.id).catch(handleError)
|
await playServerProject(e.id).catch(handleError)
|
||||||
@@ -1401,7 +1574,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
<AppSettingsModal ref="settingsModal" />
|
<AppSettingsModal ref="settingsModal" />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
<Suspense>
|
<Suspense>
|
||||||
<AuthGrantFlowWaitModal ref="modrinthLoginFlowWaitModal" @flow-cancel="cancelLogin" />
|
<ModrinthAccountRequiredModal ref="modrinthLoginModal" :request-auth="requestModrinthAuth" />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
<CreationFlowModal
|
<CreationFlowModal
|
||||||
ref="installationModal"
|
ref="installationModal"
|
||||||
@@ -1505,7 +1678,11 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
</template>
|
</template>
|
||||||
<template #sign-out> <LogOutIcon /> Sign out </template>
|
<template #sign-out> <LogOutIcon /> Sign out </template>
|
||||||
</OverflowMenu>
|
</OverflowMenu>
|
||||||
<NavButton v-else v-tooltip.right="'Sign in to a Modrinth account'" :to="() => signIn()">
|
<NavButton
|
||||||
|
v-else
|
||||||
|
v-tooltip.right="'Sign in to a Modrinth account'"
|
||||||
|
:to="() => requestSignIn()"
|
||||||
|
>
|
||||||
<LogInIcon class="text-brand" />
|
<LogInIcon class="text-brand" />
|
||||||
</NavButton>
|
</NavButton>
|
||||||
</div>
|
</div>
|
||||||
@@ -1652,7 +1829,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
</div>
|
</div>
|
||||||
<div class="p-4 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid">
|
<div class="p-4 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid">
|
||||||
<suspense>
|
<suspense>
|
||||||
<FriendsList :credentials="credentials" :sign-in="() => signIn()" />
|
<FriendsList :credentials="credentials" :sign-in="() => requestSignIn()" />
|
||||||
</suspense>
|
</suspense>
|
||||||
</div>
|
</div>
|
||||||
<PrideFundraiserBanner
|
<PrideFundraiserBanner
|
||||||
@@ -1693,6 +1870,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
<PopupNotificationPanel :has-sidebar="sidebarVisible" />
|
<PopupNotificationPanel :has-sidebar="sidebarVisible" />
|
||||||
<ErrorModal ref="errorModal" />
|
<ErrorModal ref="errorModal" />
|
||||||
<MinecraftAuthErrorModal ref="minecraftAuthErrorModal" />
|
<MinecraftAuthErrorModal ref="minecraftAuthErrorModal" />
|
||||||
|
<MinecraftRequiredModal ref="minecraftRequiredModal" />
|
||||||
<ContentInstallModal
|
<ContentInstallModal
|
||||||
ref="modInstallModal"
|
ref="modInstallModal"
|
||||||
:instances="contentInstallInstances"
|
:instances="contentInstallInstances"
|
||||||
@@ -1736,8 +1914,9 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
|||||||
@create-anyway="handleContentInstallModpackDuplicateCreateAnyway"
|
@create-anyway="handleContentInstallModpackDuplicateCreateAnyway"
|
||||||
@go-to-instance="handleContentInstallModpackDuplicateGoToInstance"
|
@go-to-instance="handleContentInstallModpackDuplicateGoToInstance"
|
||||||
/>
|
/>
|
||||||
<InstallToPlayModal ref="installToPlayModal" />
|
<SharedInstanceInviteHandler ref="sharedInstanceInviteHandler" />
|
||||||
<UpdateToPlayModal ref="updateToPlayModal" />
|
<InstallToPlayModal ref="installToPlayModal" :show-external-warnings="false" />
|
||||||
|
<UpdateToPlayModal ref="updateToPlayModal" :show-external-warnings="false" />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
|
|||||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 50 KiB |
@@ -65,8 +65,7 @@ async function duplicateInstance(p) {
|
|||||||
const handleRightClick = (event, instanceId) => {
|
const handleRightClick = (event, instanceId) => {
|
||||||
const item = instanceComponents.value.find((x) => x.instance.id === instanceId)
|
const item = instanceComponents.value.find((x) => x.instance.id === instanceId)
|
||||||
const baseOptions = [
|
const baseOptions = [
|
||||||
{ name: 'add_content' },
|
...(item.instance.quarantined ? [] : [{ name: 'add_content' }, { type: 'divider' }]),
|
||||||
{ type: 'divider' },
|
|
||||||
{ name: 'edit' },
|
{ name: 'edit' },
|
||||||
{ name: 'duplicate' },
|
{ name: 'duplicate' },
|
||||||
{ name: 'open' },
|
{ name: 'open' },
|
||||||
@@ -90,10 +89,14 @@ const handleRightClick = (event, instanceId) => {
|
|||||||
...baseOptions,
|
...baseOptions,
|
||||||
]
|
]
|
||||||
: [
|
: [
|
||||||
{
|
...(item.instance.quarantined
|
||||||
name: 'play',
|
? []
|
||||||
color: 'primary',
|
: [
|
||||||
},
|
{
|
||||||
|
name: 'play',
|
||||||
|
color: 'primary',
|
||||||
|
},
|
||||||
|
]),
|
||||||
...baseOptions,
|
...baseOptions,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -73,8 +73,7 @@ async function duplicateInstance(p) {
|
|||||||
|
|
||||||
const handleInstanceRightClick = async (event, passedInstance) => {
|
const handleInstanceRightClick = async (event, passedInstance) => {
|
||||||
const baseOptions = [
|
const baseOptions = [
|
||||||
{ name: 'add_content' },
|
...(passedInstance.quarantined ? [] : [{ name: 'add_content' }, { type: 'divider' }]),
|
||||||
{ type: 'divider' },
|
|
||||||
{ name: 'edit' },
|
{ name: 'edit' },
|
||||||
{ name: 'duplicate' },
|
{ name: 'duplicate' },
|
||||||
{ name: 'open_folder' },
|
{ name: 'open_folder' },
|
||||||
@@ -98,10 +97,14 @@ const handleInstanceRightClick = async (event, passedInstance) => {
|
|||||||
...baseOptions,
|
...baseOptions,
|
||||||
]
|
]
|
||||||
: [
|
: [
|
||||||
{
|
...(passedInstance.quarantined
|
||||||
name: 'play',
|
? []
|
||||||
color: 'primary',
|
: [
|
||||||
},
|
{
|
||||||
|
name: 'play',
|
||||||
|
color: 'primary',
|
||||||
|
},
|
||||||
|
]),
|
||||||
...baseOptions,
|
...baseOptions,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@@ -52,10 +52,6 @@ defineExpose({
|
|||||||
if (errorVal.message.includes('because the target machine actively refused it')) {
|
if (errorVal.message.includes('because the target machine actively refused it')) {
|
||||||
metadata.value.hostsFile = true
|
metadata.value.hostsFile = true
|
||||||
}
|
}
|
||||||
} else if (errorVal.message && errorVal.message.includes('User is not logged in')) {
|
|
||||||
title.value = 'Sign in to Minecraft'
|
|
||||||
errorType.value = 'minecraft_sign_in'
|
|
||||||
supportLink.value = 'https://support.modrinth.com'
|
|
||||||
} else if (errorVal.message && errorVal.message.includes('Move directory error:')) {
|
} else if (errorVal.message && errorVal.message.includes('Move directory error:')) {
|
||||||
title.value = 'Could not change app directory'
|
title.value = 'Could not change app directory'
|
||||||
errorType.value = 'directory_move'
|
errorType.value = 'directory_move'
|
||||||
@@ -243,20 +239,6 @@ async function copyToClipboard(text) {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<div v-else-if="errorType === 'minecraft_sign_in'">
|
|
||||||
<p>
|
|
||||||
To play this instance, you must sign in through Microsoft below. If you don't have a
|
|
||||||
Minecraft account, you can purchase the game on the
|
|
||||||
<a href="https://www.minecraft.net/en-us/store/minecraft-java-bedrock-edition-pc"
|
|
||||||
>Minecraft website</a
|
|
||||||
>.
|
|
||||||
</p>
|
|
||||||
<div class="cta-button">
|
|
||||||
<button class="btn btn-primary" :disabled="loadingMinecraft" @click="loginMinecraft">
|
|
||||||
<LogInIcon /> Sign in to Minecraft
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<template v-else-if="errorType === 'state_init'">
|
<template v-else-if="errorType === 'state_init'">
|
||||||
<p>
|
<p>
|
||||||
Modrinth App failed to load correctly. This may be because of a corrupted file, or
|
Modrinth App failed to load correctly. This may be because of a corrupted file, or
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ const checkProcess = async () => {
|
|||||||
|
|
||||||
const play = async (e, context) => {
|
const play = async (e, context) => {
|
||||||
e?.stopPropagation()
|
e?.stopPropagation()
|
||||||
|
if (props.instance.quarantined) return
|
||||||
loading.value = true
|
loading.value = true
|
||||||
await run(props.instance.id)
|
await run(props.instance.id)
|
||||||
.catch((err) => handleSevereError(err, { instanceId: props.instance.id }))
|
.catch((err) => handleSevereError(err, { instanceId: props.instance.id }))
|
||||||
@@ -94,6 +95,7 @@ const stop = async (e, context) => {
|
|||||||
|
|
||||||
const repair = async (e) => {
|
const repair = async (e) => {
|
||||||
e?.stopPropagation()
|
e?.stopPropagation()
|
||||||
|
if (props.instance.quarantined) return
|
||||||
|
|
||||||
if (
|
if (
|
||||||
props.instance.install_stage !== 'pack_installed' &&
|
props.instance.install_stage !== 'pack_installed' &&
|
||||||
@@ -116,6 +118,7 @@ const openFolder = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const addContent = async () => {
|
const addContent = async () => {
|
||||||
|
if (props.instance.quarantined) return
|
||||||
await router.push({
|
await router.push({
|
||||||
path: `/browse/${props.instance.loader === 'vanilla' ? 'datapack' : 'mod'}`,
|
path: `/browse/${props.instance.loader === 'vanilla' ? 'datapack' : 'mod'}`,
|
||||||
query: { i: props.instance.id },
|
query: { i: props.instance.id },
|
||||||
@@ -142,7 +145,9 @@ const unlisten = await process_listener((e) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
onMounted(() => checkProcess())
|
onMounted(() => {
|
||||||
|
checkProcess()
|
||||||
|
})
|
||||||
onUnmounted(() => unlisten())
|
onUnmounted(() => unlisten())
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -173,7 +178,11 @@ onUnmounted(() => unlisten())
|
|||||||
<SpinnerIcon class="animate-spin" />
|
<SpinnerIcon class="animate-spin" />
|
||||||
</button>
|
</button>
|
||||||
</ButtonStyled>
|
</ButtonStyled>
|
||||||
<ButtonStyled v-else :color="first ? 'brand' : 'standard'" circular>
|
<ButtonStyled
|
||||||
|
v-else-if="!instance.quarantined"
|
||||||
|
:color="first ? 'brand' : 'standard'"
|
||||||
|
circular
|
||||||
|
>
|
||||||
<button
|
<button
|
||||||
v-tooltip="'Play'"
|
v-tooltip="'Play'"
|
||||||
@click="(e) => play(e, 'InstanceCard')"
|
@click="(e) => play(e, 'InstanceCard')"
|
||||||
@@ -227,7 +236,12 @@ onUnmounted(() => unlisten())
|
|||||||
class="animate-spin w-8 h-8"
|
class="animate-spin w-8 h-8"
|
||||||
tabindex="-1"
|
tabindex="-1"
|
||||||
/>
|
/>
|
||||||
<ButtonStyled v-else-if="!installed" size="large" color="brand" circular>
|
<ButtonStyled
|
||||||
|
v-else-if="!installed && !instance.quarantined"
|
||||||
|
size="large"
|
||||||
|
color="brand"
|
||||||
|
circular
|
||||||
|
>
|
||||||
<button
|
<button
|
||||||
v-tooltip="'Repair'"
|
v-tooltip="'Repair'"
|
||||||
class="transition-all scale-75 group-hover:scale-100 group-focus-within:scale-100 origin-bottom opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 card-shadow"
|
class="transition-all scale-75 group-hover:scale-100 group-focus-within:scale-100 origin-bottom opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 card-shadow"
|
||||||
@@ -236,7 +250,7 @@ onUnmounted(() => unlisten())
|
|||||||
<DownloadIcon />
|
<DownloadIcon />
|
||||||
</button>
|
</button>
|
||||||
</ButtonStyled>
|
</ButtonStyled>
|
||||||
<ButtonStyled v-else size="large" color="brand" circular>
|
<ButtonStyled v-else-if="!instance.quarantined" size="large" color="brand" circular>
|
||||||
<button
|
<button
|
||||||
v-tooltip="'Play'"
|
v-tooltip="'Play'"
|
||||||
class="transition-all scale-75 group-hover:scale-100 group-focus-within:scale-100 origin-bottom opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 card-shadow"
|
class="transition-all scale-75 group-hover:scale-100 group-focus-within:scale-100 origin-bottom opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 card-shadow"
|
||||||
|
|||||||
@@ -10,18 +10,12 @@ import {
|
|||||||
useRelativeTime,
|
useRelativeTime,
|
||||||
useVIntl,
|
useVIntl,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { computed, onUnmounted, ref, watch } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
import FriendsSection from '@/components/ui/friends/FriendsSection.vue'
|
import FriendsSection from '@/components/ui/friends/FriendsSection.vue'
|
||||||
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
|
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
|
||||||
import { friend_listener } from '@/helpers/events'
|
import { useFriends } from '@/composables/use-friends'
|
||||||
import {
|
import type { FriendWithUserData } from '@/helpers/friends.ts'
|
||||||
add_friend,
|
|
||||||
friends,
|
|
||||||
type FriendWithUserData,
|
|
||||||
remove_friend,
|
|
||||||
transformFriends,
|
|
||||||
} from '@/helpers/friends.ts'
|
|
||||||
import type { ModrinthCredentials } from '@/helpers/mr_auth'
|
import type { ModrinthCredentials } from '@/helpers/mr_auth'
|
||||||
|
|
||||||
const { formatMessage } = useVIntl()
|
const { formatMessage } = useVIntl()
|
||||||
@@ -35,36 +29,23 @@ const props = defineProps<{
|
|||||||
}>()
|
}>()
|
||||||
|
|
||||||
const userCredentials = computed(() => props.credentials)
|
const userCredentials = computed(() => props.credentials)
|
||||||
|
const {
|
||||||
|
friends: userFriends,
|
||||||
|
loading,
|
||||||
|
requestFriend,
|
||||||
|
acceptFriend,
|
||||||
|
removeFriend: removeFriendRecord,
|
||||||
|
} = useFriends({
|
||||||
|
currentUserId: () => userCredentials.value?.user_id,
|
||||||
|
getCredentials: () => userCredentials.value,
|
||||||
|
onError: handleError,
|
||||||
|
})
|
||||||
|
|
||||||
const search = ref('')
|
const search = ref('')
|
||||||
const friendInvitesModal = ref()
|
const friendInvitesModal = ref()
|
||||||
|
|
||||||
const username = ref('')
|
const username = ref('')
|
||||||
const addFriendModal = ref()
|
const addFriendModal = ref()
|
||||||
async function addFriendFromModal() {
|
|
||||||
addFriendModal.value.hide()
|
|
||||||
await add_friend(username.value).catch(handleError)
|
|
||||||
username.value = ''
|
|
||||||
await loadFriends()
|
|
||||||
}
|
|
||||||
|
|
||||||
async function addFriend(friend: FriendWithUserData) {
|
|
||||||
const id = friend.id === userCredentials.value?.user_id ? friend.friend_id : friend.id
|
|
||||||
if (id) {
|
|
||||||
await add_friend(id).catch(handleError)
|
|
||||||
await loadFriends()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function removeFriend(friend: FriendWithUserData) {
|
|
||||||
const id = friend.id === userCredentials.value?.user_id ? friend.friend_id : friend.id
|
|
||||||
if (id) {
|
|
||||||
await remove_friend(id).catch(handleError)
|
|
||||||
await loadFriends()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const userFriends = ref<FriendWithUserData[]>([])
|
|
||||||
const sortedFriends = computed<FriendWithUserData[]>(() =>
|
const sortedFriends = computed<FriendWithUserData[]>(() =>
|
||||||
userFriends.value.slice().sort((a, b) => {
|
userFriends.value.slice().sort((a, b) => {
|
||||||
if (a.last_updated === null && b.last_updated === null) {
|
if (a.last_updated === null && b.last_updated === null) {
|
||||||
@@ -108,42 +89,22 @@ const incomingRequests = computed(() =>
|
|||||||
.sort((a, b) => b.created.diff(a.created)),
|
.sort((a, b) => b.created.diff(a.created)),
|
||||||
)
|
)
|
||||||
|
|
||||||
const loading = ref(true)
|
function addFriendFromModal() {
|
||||||
async function loadFriends(timeout = false) {
|
const target = username.value.trim()
|
||||||
loading.value = timeout
|
if (!target) return
|
||||||
|
|
||||||
try {
|
addFriendModal.value.hide()
|
||||||
const friendsList = await friends()
|
requestFriend({ id: target, username: target })
|
||||||
userFriends.value = await transformFriends(friendsList, userCredentials.value)
|
username.value = ''
|
||||||
loading.value = false
|
|
||||||
} catch (e) {
|
|
||||||
console.error('Error loading friends', e)
|
|
||||||
if (timeout) {
|
|
||||||
setTimeout(() => loadFriends(), 15 * 1000)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(
|
function addFriend(friend: FriendWithUserData) {
|
||||||
userCredentials,
|
acceptFriend(friend)
|
||||||
() => {
|
}
|
||||||
if (userCredentials.value === undefined) {
|
|
||||||
userFriends.value = []
|
|
||||||
loading.value = false
|
|
||||||
} else if (userCredentials.value === null) {
|
|
||||||
userFriends.value = []
|
|
||||||
loading.value = false
|
|
||||||
} else {
|
|
||||||
loadFriends(true)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ immediate: true },
|
|
||||||
)
|
|
||||||
|
|
||||||
const unlisten = await friend_listener(() => loadFriends())
|
function removeFriend(friend: FriendWithUserData) {
|
||||||
onUnmounted(() => {
|
removeFriendRecord(friend)
|
||||||
unlisten()
|
}
|
||||||
})
|
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
addFriend: {
|
addFriend: {
|
||||||
|
|||||||
@@ -1,108 +1,41 @@
|
|||||||
<template>
|
<template>
|
||||||
<NewModal ref="modal" :header="formatMessage(messages.header)" :on-hide="reset">
|
<UnknownFileWarningModal
|
||||||
<div class="max-w-[31rem] flex flex-col gap-6">
|
ref="modal"
|
||||||
<Admonition
|
:mode="externalFilesInModpack.length > 0 ? 'modpack' : 'mod'"
|
||||||
type="warning"
|
:file-name="fileName"
|
||||||
:header="formatMessage(messages.warningTitle)"
|
:external-files-in-modpack="externalFilesInModpack"
|
||||||
:body="formatMessage(messages.warningBody)"
|
@cancel="reset"
|
||||||
/>
|
@continue="proceed"
|
||||||
<div v-if="fileName" class="overflow-x-auto whitespace-nowrap text-sm text-secondary">
|
/>
|
||||||
{{ fileName }}
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<p class="mt-0 leading-tight">
|
|
||||||
{{ formatMessage(messages.body) }}
|
|
||||||
</p>
|
|
||||||
<p class="text-orange font-semibold mb-0 leading-tight">
|
|
||||||
{{ formatMessage(messages.malwareStatement) }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<Checkbox v-model="dontShowAgain" :label="formatMessage(messages.dontShowAgain)" />
|
|
||||||
<div class="flex gap-2 justify-end">
|
|
||||||
<ButtonStyled type="outlined">
|
|
||||||
<button @click="cancel">
|
|
||||||
<XIcon />
|
|
||||||
{{ formatMessage(commonMessages.cancelButton) }}
|
|
||||||
</button>
|
|
||||||
</ButtonStyled>
|
|
||||||
<ButtonStyled color="orange">
|
|
||||||
<button :disabled="isProceeding" @click="proceed">
|
|
||||||
<SpinnerIcon v-if="isProceeding" class="animate-spin" />
|
|
||||||
<CircleArrowRightIcon v-else />
|
|
||||||
{{ formatMessage(messages.installAnyway) }}
|
|
||||||
</button>
|
|
||||||
</ButtonStyled>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</NewModal>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { CircleArrowRightIcon, SpinnerIcon, XIcon } from '@modrinth/assets'
|
import { UnknownFileWarningModal } from '@modrinth/ui'
|
||||||
import {
|
|
||||||
Admonition,
|
|
||||||
ButtonStyled,
|
|
||||||
Checkbox,
|
|
||||||
commonMessages,
|
|
||||||
defineMessages,
|
|
||||||
NewModal,
|
|
||||||
useVIntl,
|
|
||||||
} from '@modrinth/ui'
|
|
||||||
import { ref, useTemplateRef } from 'vue'
|
import { ref, useTemplateRef } from 'vue'
|
||||||
|
|
||||||
import { get as getSettings, set as setSettings } from '@/helpers/settings'
|
import { get as getSettings, set as setSettings } from '@/helpers/settings'
|
||||||
import { useTheming } from '@/store/state'
|
import { useTheming } from '@/store/state'
|
||||||
import type { FeatureFlag } from '@/store/theme.ts'
|
import type { FeatureFlag } from '@/store/theme.ts'
|
||||||
|
|
||||||
const { formatMessage } = useVIntl()
|
|
||||||
const themeStore = useTheming()
|
const themeStore = useTheming()
|
||||||
const skipUnknownPackWarningFeatureFlag = 'skip_unknown_pack_warning' as FeatureFlag
|
const skipUnknownPackWarningFeatureFlag = 'skip_unknown_pack_warning' as FeatureFlag
|
||||||
|
|
||||||
const dontShowAgain = ref(false)
|
|
||||||
const modal = useTemplateRef('modal')
|
const modal = useTemplateRef('modal')
|
||||||
const onProceed = ref<() => Promise<void>>()
|
const onProceed = ref<() => Promise<void>>()
|
||||||
const isProceeding = ref(false)
|
|
||||||
const fileName = ref('')
|
const fileName = ref('')
|
||||||
|
const externalFilesInModpack = ref<string[]>([])
|
||||||
|
|
||||||
const messages = defineMessages({
|
function show(
|
||||||
header: {
|
createInstance: () => Promise<void>,
|
||||||
id: 'unknown-pack-warning-modal.header',
|
selectedFileName = '',
|
||||||
defaultMessage: 'Confirm installation',
|
selectedExternalFiles: string[] = [],
|
||||||
},
|
) {
|
||||||
warningTitle: {
|
|
||||||
id: 'unknown-pack-warning-modal.warning.title',
|
|
||||||
defaultMessage: 'Unknown file warning',
|
|
||||||
},
|
|
||||||
warningBody: {
|
|
||||||
id: 'unknown-pack-warning-modal.warning.body',
|
|
||||||
defaultMessage: `We couldn't find this file on Modrinth. We strongly recommend only installing files from sources you trust.`,
|
|
||||||
},
|
|
||||||
body: {
|
|
||||||
id: 'unknown-pack-warning-modal.body',
|
|
||||||
defaultMessage: `A file is only reviewed if it’s uploaded to Modrinth, regardless of its file format (including .mrpack).`,
|
|
||||||
},
|
|
||||||
malwareStatement: {
|
|
||||||
id: 'unknown-pack-warning-modal.malware-statement',
|
|
||||||
defaultMessage: `Malware is often distributed through modpack files by sharing them on platforms like Discord.`,
|
|
||||||
},
|
|
||||||
dontShowAgain: {
|
|
||||||
id: 'unknown-pack-warning-modal.dont-show-again',
|
|
||||||
defaultMessage: `Don't show this warning again`,
|
|
||||||
},
|
|
||||||
installAnyway: {
|
|
||||||
id: 'unknown-pack-warning-modal.install-anyway',
|
|
||||||
defaultMessage: `Install anyway`,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
function show(createInstance: () => Promise<void>, selectedFileName = '') {
|
|
||||||
onProceed.value = createInstance
|
onProceed.value = createInstance
|
||||||
fileName.value = selectedFileName
|
fileName.value = selectedFileName
|
||||||
dontShowAgain.value = false
|
externalFilesInModpack.value = selectedExternalFiles
|
||||||
|
|
||||||
if (themeStore.getFeatureFlag(skipUnknownPackWarningFeatureFlag)) {
|
if (themeStore.getFeatureFlag(skipUnknownPackWarningFeatureFlag)) {
|
||||||
// noinspection ES6MissingAwait
|
void createInstance()
|
||||||
createInstance()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,18 +45,11 @@ function show(createInstance: () => Promise<void>, selectedFileName = '') {
|
|||||||
function reset() {
|
function reset() {
|
||||||
onProceed.value = undefined
|
onProceed.value = undefined
|
||||||
fileName.value = ''
|
fileName.value = ''
|
||||||
|
externalFilesInModpack.value = []
|
||||||
}
|
}
|
||||||
|
|
||||||
function cancel() {
|
async function proceed(dontShowAgain: boolean) {
|
||||||
modal.value?.hide()
|
if (dontShowAgain) {
|
||||||
}
|
|
||||||
|
|
||||||
async function proceed() {
|
|
||||||
if (!onProceed.value) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dontShowAgain.value) {
|
|
||||||
themeStore.featureFlags[skipUnknownPackWarningFeatureFlag] = true
|
themeStore.featureFlags[skipUnknownPackWarningFeatureFlag] = true
|
||||||
const settings = await getSettings()
|
const settings = await getSettings()
|
||||||
settings.feature_flags[skipUnknownPackWarningFeatureFlag] = true
|
settings.feature_flags[skipUnknownPackWarningFeatureFlag] = true
|
||||||
@@ -131,9 +57,8 @@ async function proceed() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const createInstance = onProceed.value
|
const createInstance = onProceed.value
|
||||||
modal.value?.hide()
|
reset()
|
||||||
// noinspection ES6MissingAwait
|
if (createInstance) void createInstance()
|
||||||
createInstance()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
defineExpose({ show })
|
defineExpose({ show })
|
||||||
|
|||||||
@@ -0,0 +1,408 @@
|
|||||||
|
<template>
|
||||||
|
<PageHeader :title="instance.name">
|
||||||
|
<template #leading>
|
||||||
|
<Avatar :src="iconSrc" :alt="instance.name" size="64px" :tint-by="instance.id" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template v-if="instance.shared_instance || instance.quarantined" #badges>
|
||||||
|
<PageHeaderBadgeItem
|
||||||
|
v-if="instance.quarantined"
|
||||||
|
:icon="LockIcon"
|
||||||
|
aria-label="Locked instance information"
|
||||||
|
class="!border-orange !bg-highlight-orange !text-orange"
|
||||||
|
>
|
||||||
|
Locked
|
||||||
|
</PageHeaderBadgeItem>
|
||||||
|
<PageHeaderBadgeItem
|
||||||
|
v-else
|
||||||
|
:icon="UnknownIcon"
|
||||||
|
:tooltip="sharedInstanceTooltip"
|
||||||
|
aria-label="Shared instance information"
|
||||||
|
class="!border-blue !bg-highlight-blue !text-blue"
|
||||||
|
>
|
||||||
|
Shared
|
||||||
|
</PageHeaderBadgeItem>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #metadata>
|
||||||
|
<div v-if="isServerInstance" class="flex flex-wrap items-center gap-2">
|
||||||
|
<InstanceHeaderServerMetadata
|
||||||
|
:loading-server-ping="loadingServerPing"
|
||||||
|
:players-online="playersOnline"
|
||||||
|
:status-online="statusOnline"
|
||||||
|
:recent-plays="recentPlays"
|
||||||
|
:ping="ping"
|
||||||
|
:minecraft-server="minecraftServer"
|
||||||
|
:linked-project-v3="linkedProjectV3"
|
||||||
|
:instance-id="instance.id"
|
||||||
|
/>
|
||||||
|
<PageHeaderMetadataItem v-if="sharedInstanceManager" :action="sharedInstanceManagerAction">
|
||||||
|
{{ sharedInstanceManagerLabel }}
|
||||||
|
<Avatar
|
||||||
|
:src="sharedInstanceManager.avatarUrl"
|
||||||
|
:alt="sharedInstanceManager.name"
|
||||||
|
:tint-by="sharedInstanceManager.tintBy"
|
||||||
|
size="24px"
|
||||||
|
:circle="sharedInstanceManager.type === 'user'"
|
||||||
|
no-shadow
|
||||||
|
/>
|
||||||
|
<span class="min-w-0 truncate">{{ sharedInstanceManager.name }}</span>
|
||||||
|
</PageHeaderMetadataItem>
|
||||||
|
</div>
|
||||||
|
<PageHeaderMetadata v-else>
|
||||||
|
<PageHeaderMetadataItem :icon="Gamepad2Icon" tooltip="Minecraft version">
|
||||||
|
Minecraft {{ instance.game_version }}
|
||||||
|
</PageHeaderMetadataItem>
|
||||||
|
<PageHeaderMetadataItem
|
||||||
|
v-if="sharedInstanceManager?.type !== 'user'"
|
||||||
|
:icon="ServerLoaderIcon"
|
||||||
|
:icon-props="{ loader: loaderDisplayName }"
|
||||||
|
tooltip="Mod loader"
|
||||||
|
>
|
||||||
|
{{ loaderLabel }}
|
||||||
|
</PageHeaderMetadataItem>
|
||||||
|
<PageHeaderMetadataItem
|
||||||
|
v-if="showInstancePlayTime"
|
||||||
|
:icon="TimerIcon"
|
||||||
|
tooltip="Total playtime"
|
||||||
|
>
|
||||||
|
{{ playtimeLabel }}
|
||||||
|
</PageHeaderMetadataItem>
|
||||||
|
<PageHeaderMetadataItem v-if="sharedInstanceManager" :action="sharedInstanceManagerAction">
|
||||||
|
{{ sharedInstanceManagerLabel }}
|
||||||
|
<Avatar
|
||||||
|
:src="sharedInstanceManager.avatarUrl"
|
||||||
|
:alt="sharedInstanceManager.name"
|
||||||
|
:tint-by="sharedInstanceManager.tintBy"
|
||||||
|
size="24px"
|
||||||
|
:circle="sharedInstanceManager.type === 'user'"
|
||||||
|
no-shadow
|
||||||
|
/>
|
||||||
|
<span class="min-w-0 truncate">{{ sharedInstanceManager.name }}</span>
|
||||||
|
</PageHeaderMetadataItem>
|
||||||
|
</PageHeaderMetadata>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #actions>
|
||||||
|
<PageHeaderActions>
|
||||||
|
<ButtonStyled v-if="isInstalling" color="brand" size="large">
|
||||||
|
<button type="button" disabled>
|
||||||
|
{{ formatMessage(commonMessages.installingLabel) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled v-else-if="playing" color="red" size="large">
|
||||||
|
<button type="button" :disabled="stopping" @click="emit('stop')">
|
||||||
|
<StopCircleIcon />
|
||||||
|
{{
|
||||||
|
stopping ? formatMessage(messages.stopping) : formatMessage(commonMessages.stopButton)
|
||||||
|
}}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled v-else-if="instance.quarantined" color="brand" size="large">
|
||||||
|
<button v-tooltip="formatMessage(messages.lockedPlayTooltip)" type="button" disabled>
|
||||||
|
<PlayIcon />
|
||||||
|
{{ formatMessage(commonMessages.playButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled v-else-if="instance.install_stage !== 'installed'" color="brand" size="large">
|
||||||
|
<button type="button" @click="emit('repair')">
|
||||||
|
<DownloadIcon />
|
||||||
|
{{ formatMessage(messages.repair) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<JoinedButtons
|
||||||
|
v-else-if="!loading && isServerInstance"
|
||||||
|
:actions="serverPlayActions"
|
||||||
|
color="brand"
|
||||||
|
size="large"
|
||||||
|
/>
|
||||||
|
<ButtonStyled v-else-if="!loading" color="brand" size="large">
|
||||||
|
<button type="button" @click="emit('play')">
|
||||||
|
<PlayIcon />
|
||||||
|
{{ formatMessage(commonMessages.playButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled v-else color="brand" size="large">
|
||||||
|
<button type="button" disabled>{{ formatMessage(messages.starting) }}</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
|
||||||
|
<ButtonStyled circular size="large">
|
||||||
|
<button
|
||||||
|
v-tooltip="formatMessage(messages.instanceSettings)"
|
||||||
|
type="button"
|
||||||
|
:aria-label="formatMessage(messages.instanceSettings)"
|
||||||
|
@click="emit('settings')"
|
||||||
|
>
|
||||||
|
<SettingsIcon />
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled circular size="large" type="transparent">
|
||||||
|
<TeleportOverflowMenu
|
||||||
|
:options="moreActions"
|
||||||
|
:tooltip="formatMessage(messages.moreActions)"
|
||||||
|
:aria-label="formatMessage(messages.moreActions)"
|
||||||
|
>
|
||||||
|
<MoreVerticalIcon />
|
||||||
|
</TeleportOverflowMenu>
|
||||||
|
</ButtonStyled>
|
||||||
|
</PageHeaderActions>
|
||||||
|
</template>
|
||||||
|
</PageHeader>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
import {
|
||||||
|
DownloadIcon,
|
||||||
|
ExternalIcon,
|
||||||
|
FolderOpenIcon,
|
||||||
|
LockIcon,
|
||||||
|
MoreVerticalIcon,
|
||||||
|
PackageIcon,
|
||||||
|
PlayIcon,
|
||||||
|
ReportIcon,
|
||||||
|
SettingsIcon,
|
||||||
|
StopCircleIcon,
|
||||||
|
TagCategoryGamepad2Icon as Gamepad2Icon,
|
||||||
|
TimerIcon,
|
||||||
|
UnknownIcon,
|
||||||
|
} from '@modrinth/assets'
|
||||||
|
import {
|
||||||
|
Avatar,
|
||||||
|
ButtonStyled,
|
||||||
|
commonMessages,
|
||||||
|
defineMessages,
|
||||||
|
formatLoaderLabel,
|
||||||
|
type JoinedButtonAction,
|
||||||
|
JoinedButtons,
|
||||||
|
LoaderIcon as ServerLoaderIcon,
|
||||||
|
PageHeader,
|
||||||
|
PageHeaderActions,
|
||||||
|
PageHeaderBadgeItem,
|
||||||
|
PageHeaderMetadata,
|
||||||
|
PageHeaderMetadataItem,
|
||||||
|
type ServerLoader,
|
||||||
|
TeleportOverflowMenu,
|
||||||
|
type TeleportOverflowMenuItem,
|
||||||
|
useVIntl,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
|
||||||
|
import type { GameInstance } from '@/helpers/types'
|
||||||
|
|
||||||
|
import InstanceHeaderServerMetadata from './instance-page-header-server-metadata.vue'
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
createShortcut: {
|
||||||
|
id: 'instance.action.create-shortcut',
|
||||||
|
defaultMessage: 'Create shortcut',
|
||||||
|
},
|
||||||
|
exportModpack: {
|
||||||
|
id: 'instance.action.export-modpack',
|
||||||
|
defaultMessage: 'Export modpack',
|
||||||
|
},
|
||||||
|
instanceSettings: {
|
||||||
|
id: 'instance.action.settings',
|
||||||
|
defaultMessage: 'Instance settings',
|
||||||
|
},
|
||||||
|
launchInstance: {
|
||||||
|
id: 'instance.action.launch-instance',
|
||||||
|
defaultMessage: 'Launch instance',
|
||||||
|
},
|
||||||
|
moreActions: {
|
||||||
|
id: 'instance.action.more-actions',
|
||||||
|
defaultMessage: 'More actions',
|
||||||
|
},
|
||||||
|
neverPlayed: {
|
||||||
|
id: 'instance.playtime.never-played',
|
||||||
|
defaultMessage: 'Never played',
|
||||||
|
},
|
||||||
|
openFolder: {
|
||||||
|
id: 'instance.action.open-folder',
|
||||||
|
defaultMessage: 'Open folder',
|
||||||
|
},
|
||||||
|
repair: {
|
||||||
|
id: 'instance.action.repair',
|
||||||
|
defaultMessage: 'Repair',
|
||||||
|
},
|
||||||
|
lockedPlayTooltip: {
|
||||||
|
id: 'instance.locked.play-tooltip',
|
||||||
|
defaultMessage: 'This instance has been locked',
|
||||||
|
},
|
||||||
|
starting: {
|
||||||
|
id: 'instance.action.starting',
|
||||||
|
defaultMessage: 'Starting...',
|
||||||
|
},
|
||||||
|
stopping: {
|
||||||
|
id: 'instance.action.stopping',
|
||||||
|
defaultMessage: 'Stopping...',
|
||||||
|
},
|
||||||
|
sharedInstanceTooltip: {
|
||||||
|
id: 'instance.shared-instance.tooltip',
|
||||||
|
defaultMessage: "This instance's content is being managed by someone else.",
|
||||||
|
},
|
||||||
|
sharedInstanceOwnerTooltip: {
|
||||||
|
id: 'instance.shared-instance.owner-tooltip',
|
||||||
|
defaultMessage: "This instance's content is being shared to other users.",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
instance: GameInstance
|
||||||
|
iconSrc?: string | null
|
||||||
|
isServerInstance?: boolean
|
||||||
|
showInstancePlayTime?: boolean
|
||||||
|
timePlayed?: number
|
||||||
|
playing?: boolean
|
||||||
|
loading?: boolean
|
||||||
|
stopping?: boolean
|
||||||
|
loadingServerPing?: boolean
|
||||||
|
playersOnline?: number
|
||||||
|
statusOnline?: boolean
|
||||||
|
recentPlays?: number
|
||||||
|
ping?: number
|
||||||
|
minecraftServer?: Labrinth.Projects.v3.Project['minecraft_server']
|
||||||
|
linkedProjectV3?: Labrinth.Projects.v3.Project
|
||||||
|
sharedInstanceManager?: {
|
||||||
|
type: 'user' | 'server'
|
||||||
|
name: string
|
||||||
|
avatarUrl?: string
|
||||||
|
tintBy: string
|
||||||
|
} | null
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
iconSrc: null,
|
||||||
|
isServerInstance: false,
|
||||||
|
showInstancePlayTime: false,
|
||||||
|
timePlayed: 0,
|
||||||
|
playing: false,
|
||||||
|
loading: false,
|
||||||
|
stopping: false,
|
||||||
|
loadingServerPing: false,
|
||||||
|
playersOnline: undefined,
|
||||||
|
statusOnline: false,
|
||||||
|
recentPlays: undefined,
|
||||||
|
ping: undefined,
|
||||||
|
minecraftServer: undefined,
|
||||||
|
linkedProjectV3: undefined,
|
||||||
|
sharedInstanceManager: null,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
repair: []
|
||||||
|
stop: []
|
||||||
|
play: []
|
||||||
|
playServer: []
|
||||||
|
settings: []
|
||||||
|
openFolder: []
|
||||||
|
export: []
|
||||||
|
createShortcut: []
|
||||||
|
report: [event?: MouseEvent]
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const installingStages = [
|
||||||
|
'installing',
|
||||||
|
'pack_installing',
|
||||||
|
'pack_installed',
|
||||||
|
'not_installed',
|
||||||
|
'minecraft_installing',
|
||||||
|
]
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
|
const isInstalling = computed(() => installingStages.includes(props.instance.install_stage))
|
||||||
|
const loaderDisplayName = computed(() => formatLoaderLabel(props.instance.loader) as ServerLoader)
|
||||||
|
const loaderLabel = computed(() =>
|
||||||
|
[loaderDisplayName.value, props.instance.loader_version].filter(Boolean).join(' '),
|
||||||
|
)
|
||||||
|
const sharedInstanceTooltip = computed(() =>
|
||||||
|
formatMessage(
|
||||||
|
props.instance.shared_instance?.role === 'owner'
|
||||||
|
? messages.sharedInstanceOwnerTooltip
|
||||||
|
: messages.sharedInstanceTooltip,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
const sharedInstanceManagerLabel = computed(() =>
|
||||||
|
props.sharedInstanceManager?.type === 'server' ? 'Linked to' : 'Managed by',
|
||||||
|
)
|
||||||
|
const sharedInstanceManagerAction = computed(() => {
|
||||||
|
const manager = props.sharedInstanceManager
|
||||||
|
if (manager?.type !== 'user') return undefined
|
||||||
|
return () => openUrl(`https://modrinth.com/user/${encodeURIComponent(manager.name)}`)
|
||||||
|
})
|
||||||
|
const playtimeLabel = computed(() => {
|
||||||
|
if (props.timePlayed <= 0) return formatMessage(messages.neverPlayed)
|
||||||
|
|
||||||
|
const hours = Math.floor(props.timePlayed / 3600)
|
||||||
|
if (hours >= 1) {
|
||||||
|
return `${hours} hour${hours > 1 ? 's' : ''}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const minutes = Math.floor(props.timePlayed / 60)
|
||||||
|
if (minutes >= 1) {
|
||||||
|
return `${minutes} minute${minutes > 1 ? 's' : ''}`
|
||||||
|
}
|
||||||
|
|
||||||
|
const seconds = Math.floor(props.timePlayed)
|
||||||
|
return `${seconds} second${seconds > 1 ? 's' : ''}`
|
||||||
|
})
|
||||||
|
const serverPlayActions = computed<JoinedButtonAction[]>(() => [
|
||||||
|
{
|
||||||
|
id: 'join_server',
|
||||||
|
label: formatMessage(commonMessages.playButton),
|
||||||
|
icon: PlayIcon,
|
||||||
|
action: () => emit('playServer'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'launch_instance',
|
||||||
|
label: formatMessage(messages.launchInstance),
|
||||||
|
icon: PlayIcon,
|
||||||
|
action: () => emit('play'),
|
||||||
|
},
|
||||||
|
])
|
||||||
|
const moreActions = computed<TeleportOverflowMenuItem[]>(() => {
|
||||||
|
const actions: TeleportOverflowMenuItem[] = [
|
||||||
|
{
|
||||||
|
id: 'open-folder',
|
||||||
|
label: formatMessage(messages.openFolder),
|
||||||
|
icon: FolderOpenIcon,
|
||||||
|
action: () => emit('openFolder'),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
if (!props.instance.quarantined) {
|
||||||
|
actions.push(
|
||||||
|
{
|
||||||
|
id: 'export-mrpack',
|
||||||
|
label: formatMessage(messages.exportModpack),
|
||||||
|
icon: PackageIcon,
|
||||||
|
action: () => emit('export'),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'create-shortcut',
|
||||||
|
label: formatMessage(messages.createShortcut),
|
||||||
|
icon: ExternalIcon,
|
||||||
|
action: () => emit('createShortcut'),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props.instance.shared_instance?.role === 'member') {
|
||||||
|
actions.push(
|
||||||
|
{ divider: true },
|
||||||
|
{
|
||||||
|
id: 'report-shared-instance',
|
||||||
|
label: formatMessage(commonMessages.reportButton),
|
||||||
|
icon: ReportIcon,
|
||||||
|
color: 'red',
|
||||||
|
action: (event) => emit('report', event),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return actions
|
||||||
|
})
|
||||||
|
</script>
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex items-center flex-wrap gap-2">
|
||||||
|
<template v-if="loadingServerPing">
|
||||||
|
<ServerOnlinePlayers
|
||||||
|
v-if="playersOnline !== undefined"
|
||||||
|
:online="playersOnline"
|
||||||
|
:status-online="statusOnline"
|
||||||
|
hide-label
|
||||||
|
/>
|
||||||
|
<ServerRecentPlays :recent-plays="recentPlays ?? 0" hide-label />
|
||||||
|
<div
|
||||||
|
v-if="
|
||||||
|
(playersOnline !== undefined || recentPlays !== undefined) &&
|
||||||
|
(minecraftServer?.region || ping)
|
||||||
|
"
|
||||||
|
class="w-1.5 h-1.5 rounded-full bg-surface-5"
|
||||||
|
></div>
|
||||||
|
<ServerPing v-if="ping" :ping="ping" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<ServerRegion v-if="minecraftServer?.region" :region="minecraftServer?.region" />
|
||||||
|
|
||||||
|
<div v-if="minecraftServer?.region || ping" class="w-1.5 h-1.5 rounded-full bg-surface-5"></div>
|
||||||
|
|
||||||
|
<div v-if="linkedProjectV3" class="flex gap-1.5 items-center font-medium text-primary">
|
||||||
|
Linked to
|
||||||
|
<Avatar
|
||||||
|
:src="linkedProjectV3.icon_url"
|
||||||
|
:alt="linkedProjectV3.name"
|
||||||
|
:tint-by="instanceId"
|
||||||
|
size="24px"
|
||||||
|
/>
|
||||||
|
<router-link
|
||||||
|
:to="`/project/${linkedProjectV3.slug ?? linkedProjectV3.id}`"
|
||||||
|
class="hover:underline text-primary truncate"
|
||||||
|
>
|
||||||
|
{{ linkedProjectV3.name }}
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
import {
|
||||||
|
Avatar,
|
||||||
|
ServerOnlinePlayers,
|
||||||
|
ServerPing,
|
||||||
|
ServerRecentPlays,
|
||||||
|
ServerRegion,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
|
||||||
|
defineProps<{
|
||||||
|
loadingServerPing?: boolean
|
||||||
|
playersOnline?: number
|
||||||
|
statusOnline?: boolean
|
||||||
|
recentPlays?: number
|
||||||
|
ping?: number
|
||||||
|
minecraftServer?: Labrinth.Projects.v3.Project['minecraft_server']
|
||||||
|
linkedProjectV3?: Labrinth.Projects.v3.Project
|
||||||
|
instanceId?: string
|
||||||
|
}>()
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
<template>
|
||||||
|
<StackedAdmonitions v-bind="$attrs" :items="stackItems" class="w-full">
|
||||||
|
<template #item="{ item, dismissible }">
|
||||||
|
<InstanceAdmonitionsSharedInstanceStale
|
||||||
|
v-if="item.kind === 'shared-instance-stale'"
|
||||||
|
:instance="instance"
|
||||||
|
@published="emit('published')"
|
||||||
|
/>
|
||||||
|
<InstanceAdmonitionsSharedInstanceWrongAccount
|
||||||
|
v-else-if="item.kind === 'shared-instance-wrong-account'"
|
||||||
|
:expected-user-id="sharedInstanceExpectedUserId"
|
||||||
|
:role="sharedInstanceRole"
|
||||||
|
:signed-out="sharedInstanceSignedOut"
|
||||||
|
/>
|
||||||
|
<InstanceAdmonitionsSharedInstanceUnavailable
|
||||||
|
v-else-if="item.kind === 'shared-instance-unavailable'"
|
||||||
|
:reason="displayedSharedInstanceUnavailableReason"
|
||||||
|
:manager="sharedInstanceUnavailableManager"
|
||||||
|
:dismissible="dismissible"
|
||||||
|
@dismiss="sharedInstanceUnavailableDismissed = true"
|
||||||
|
@delete="emit('delete')"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</StackedAdmonitions>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { StackedAdmonitions } from '@modrinth/ui'
|
||||||
|
import { computed, ref, watch } from 'vue'
|
||||||
|
|
||||||
|
import type { SharedInstanceUnavailableReason } from '@/helpers/install'
|
||||||
|
import type { GameInstance } from '@/helpers/types'
|
||||||
|
|
||||||
|
import InstanceAdmonitionsSharedInstanceStale from './instance-admonitions-shared-instance-stale.vue'
|
||||||
|
import InstanceAdmonitionsSharedInstanceUnavailable from './instance-admonitions-shared-instance-unavailable.vue'
|
||||||
|
import InstanceAdmonitionsSharedInstanceWrongAccount from './instance-admonitions-shared-instance-wrong-account.vue'
|
||||||
|
import type { InstanceAdmonitionItem, SharedInstanceRole } from './types'
|
||||||
|
|
||||||
|
defineOptions({
|
||||||
|
inheritAttrs: false,
|
||||||
|
})
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
instance: GameInstance
|
||||||
|
sharedInstanceUnavailableReason?: SharedInstanceUnavailableReason | null
|
||||||
|
sharedInstanceUnavailableManager?: string | null
|
||||||
|
sharedInstanceWrongAccount?: boolean
|
||||||
|
sharedInstanceExpectedUserId?: string | null
|
||||||
|
sharedInstanceRole?: SharedInstanceRole | null
|
||||||
|
sharedInstanceSignedOut?: boolean
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
published: []
|
||||||
|
delete: []
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const sharedInstanceWrongAccount = computed(() => props.sharedInstanceWrongAccount ?? false)
|
||||||
|
const displayedSharedInstanceUnavailableReason = computed<SharedInstanceUnavailableReason | null>(
|
||||||
|
() =>
|
||||||
|
props.instance.quarantined ? 'quarantined' : (props.sharedInstanceUnavailableReason ?? null),
|
||||||
|
)
|
||||||
|
const sharedInstanceUnavailableDismissed = ref(false)
|
||||||
|
const showSharedInstancePublishAdmonition = computed(
|
||||||
|
() =>
|
||||||
|
!sharedInstanceWrongAccount.value &&
|
||||||
|
props.instance.install_stage === 'installed' &&
|
||||||
|
props.instance.shared_instance?.role === 'owner' &&
|
||||||
|
props.instance.shared_instance.status === 'stale',
|
||||||
|
)
|
||||||
|
|
||||||
|
const stackItems = computed<InstanceAdmonitionItem[]>(() => {
|
||||||
|
const items: InstanceAdmonitionItem[] = []
|
||||||
|
|
||||||
|
if (sharedInstanceWrongAccount.value) {
|
||||||
|
items.push({
|
||||||
|
id: 'shared-instance-wrong-account',
|
||||||
|
type: 'warning',
|
||||||
|
dismissible: false,
|
||||||
|
kind: 'shared-instance-wrong-account',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const unavailableReason = displayedSharedInstanceUnavailableReason.value
|
||||||
|
const sharedInstanceQuarantined = unavailableReason === 'quarantined'
|
||||||
|
if (
|
||||||
|
unavailableReason &&
|
||||||
|
(sharedInstanceQuarantined || !sharedInstanceUnavailableDismissed.value)
|
||||||
|
) {
|
||||||
|
items.push({
|
||||||
|
id: 'shared-instance-unavailable',
|
||||||
|
type: 'warning',
|
||||||
|
dismissible: !sharedInstanceQuarantined,
|
||||||
|
kind: 'shared-instance-unavailable',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showSharedInstancePublishAdmonition.value) {
|
||||||
|
items.push({
|
||||||
|
id: 'shared-instance-stale',
|
||||||
|
type: 'warning',
|
||||||
|
dismissible: false,
|
||||||
|
kind: 'shared-instance-stale',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return items
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => [props.instance.id, displayedSharedInstanceUnavailableReason.value],
|
||||||
|
() => {
|
||||||
|
sharedInstanceUnavailableDismissed.value = false
|
||||||
|
},
|
||||||
|
)
|
||||||
|
</script>
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
import { defineMessages } from '@modrinth/ui'
|
||||||
|
|
||||||
|
export const instanceAdmonitionsMessages = defineMessages({
|
||||||
|
sharedInstanceChangesHeader: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.changes-header',
|
||||||
|
defaultMessage: "Your changes haven't been shared yet",
|
||||||
|
},
|
||||||
|
sharedInstanceChangesBody: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.changes-body',
|
||||||
|
defaultMessage: "Your local instance is ahead of the users you've shared it with.",
|
||||||
|
},
|
||||||
|
sharedInstancePublishButton: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.publish-button',
|
||||||
|
defaultMessage: 'Push update',
|
||||||
|
},
|
||||||
|
sharedInstancePublishingButton: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.publishing-button',
|
||||||
|
defaultMessage: 'Pushing...',
|
||||||
|
},
|
||||||
|
sharedInstanceReviewingButton: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.reviewing-button',
|
||||||
|
defaultMessage: 'Reviewing...',
|
||||||
|
},
|
||||||
|
sharedInstanceReviewHeader: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.review-header',
|
||||||
|
defaultMessage: 'Review changes',
|
||||||
|
},
|
||||||
|
sharedInstanceReviewAdmonitionHeader: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.review-admonition-header',
|
||||||
|
defaultMessage: 'Push update',
|
||||||
|
},
|
||||||
|
sharedInstanceReviewDescription: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.review-description',
|
||||||
|
defaultMessage:
|
||||||
|
'Review the content changes that will be shared with everyone using this instance.',
|
||||||
|
},
|
||||||
|
sharedInstanceAddedLabel: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.added-label',
|
||||||
|
defaultMessage: 'Added',
|
||||||
|
},
|
||||||
|
sharedInstanceRemovedLabel: {
|
||||||
|
id: 'app.instance.admonitions.shared-instance.removed-label',
|
||||||
|
defaultMessage: 'Removed',
|
||||||
|
},
|
||||||
|
sharedInstanceWrongAccountHeader: {
|
||||||
|
id: 'app.instance.shared-instance-wrong-account.warning-header',
|
||||||
|
defaultMessage: 'You are using the wrong Modrinth account',
|
||||||
|
},
|
||||||
|
sharedInstanceSignedOutHeader: {
|
||||||
|
id: 'app.instance.shared-instance-wrong-account.signed-out-header',
|
||||||
|
defaultMessage: 'You need to sign in to Modrinth',
|
||||||
|
},
|
||||||
|
sharedInstanceWrongAccountSignInAs: {
|
||||||
|
id: 'app.instance.shared-instance-wrong-account.sign-in-as-label',
|
||||||
|
defaultMessage: 'Sign in as',
|
||||||
|
},
|
||||||
|
sharedInstanceWrongAccountUserBody: {
|
||||||
|
id: 'app.instance.shared-instance-wrong-account.user-admonition-body-v2',
|
||||||
|
defaultMessage: 'to receive updates for this shared instance.',
|
||||||
|
},
|
||||||
|
sharedInstanceWrongAccountOwnerBody: {
|
||||||
|
id: 'app.instance.shared-instance-wrong-account.owner-admonition-body-v2',
|
||||||
|
defaultMessage: "to manage this shared instance. You won't be able to push updates to users.",
|
||||||
|
},
|
||||||
|
sharedInstanceWrongAccountFallbackUsername: {
|
||||||
|
id: 'app.instance.shared-instance-wrong-account.fallback-username',
|
||||||
|
defaultMessage: 'the linked account',
|
||||||
|
},
|
||||||
|
})
|
||||||
+66
@@ -0,0 +1,66 @@
|
|||||||
|
<template>
|
||||||
|
<Admonition
|
||||||
|
type="info"
|
||||||
|
inline-actions
|
||||||
|
:header="formatMessage(messages.sharedInstanceChangesHeader)"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.sharedInstanceChangesBody) }}
|
||||||
|
<template #actions>
|
||||||
|
<ButtonStyled color="blue">
|
||||||
|
<button class="!h-10" :disabled="isPublishButtonDisabled" @click="reviewChanges">
|
||||||
|
<SpinnerIcon
|
||||||
|
v-if="isReviewingPublish || isPublishing"
|
||||||
|
class="animate-spin"
|
||||||
|
aria-hidden="true"
|
||||||
|
/>
|
||||||
|
<UploadIcon v-else aria-hidden="true" />
|
||||||
|
{{
|
||||||
|
isPublishing
|
||||||
|
? formatMessage(messages.sharedInstancePublishingButton)
|
||||||
|
: isReviewingPublish
|
||||||
|
? formatMessage(messages.sharedInstanceReviewingButton)
|
||||||
|
: formatMessage(messages.sharedInstancePublishButton)
|
||||||
|
}}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
</Admonition>
|
||||||
|
|
||||||
|
<SharedInstancePublishModal
|
||||||
|
ref="publishModal"
|
||||||
|
:instance="instance"
|
||||||
|
@published="emit('published')"
|
||||||
|
@state-change="publishState = $event"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { SpinnerIcon, UploadIcon } from '@modrinth/assets'
|
||||||
|
import { Admonition, ButtonStyled, useVIntl } from '@modrinth/ui'
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
|
import SharedInstancePublishModal from '@/components/ui/shared-instances/SharedInstancePublishModal.vue'
|
||||||
|
import type { GameInstance } from '@/helpers/types'
|
||||||
|
|
||||||
|
import { instanceAdmonitionsMessages as messages } from './instance-admonitions-messages'
|
||||||
|
|
||||||
|
defineProps<{
|
||||||
|
instance: GameInstance
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
published: []
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const publishModal = ref<InstanceType<typeof SharedInstancePublishModal>>()
|
||||||
|
const publishState = ref<'idle' | 'reviewing' | 'publishing'>('idle')
|
||||||
|
const isPublishing = computed(() => publishState.value === 'publishing')
|
||||||
|
const isReviewingPublish = computed(() => publishState.value === 'reviewing')
|
||||||
|
|
||||||
|
const isPublishButtonDisabled = computed(() => isPublishing.value || isReviewingPublish.value)
|
||||||
|
|
||||||
|
function reviewChanges(e?: MouseEvent) {
|
||||||
|
publishModal.value?.show(e)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
+51
@@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<Admonition
|
||||||
|
type="warning"
|
||||||
|
:inline-actions="reason === 'quarantined'"
|
||||||
|
:header="formatMessage(sharedInstanceUnavailableTitleMessage(reason ?? null))"
|
||||||
|
:dismissible="dismissible"
|
||||||
|
@dismiss="emit('dismiss')"
|
||||||
|
>
|
||||||
|
{{ formatSharedInstanceUnavailable(reason ?? null, manager) }}
|
||||||
|
<template v-if="reason === 'quarantined'" #actions>
|
||||||
|
<ButtonStyled color="orange">
|
||||||
|
<button class="!h-10" @click="emit('delete')">
|
||||||
|
<TrashIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(messages.deleteInstance) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
</Admonition>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { TrashIcon } from '@modrinth/assets'
|
||||||
|
import { Admonition, ButtonStyled, defineMessages, useVIntl } from '@modrinth/ui'
|
||||||
|
|
||||||
|
import type { SharedInstanceUnavailableReason } from '@/helpers/install'
|
||||||
|
import {
|
||||||
|
sharedInstanceUnavailableTitleMessage,
|
||||||
|
useSharedInstanceErrors,
|
||||||
|
} from '@/helpers/shared-instance-errors'
|
||||||
|
|
||||||
|
defineProps<{
|
||||||
|
reason?: SharedInstanceUnavailableReason | null
|
||||||
|
manager?: string | null
|
||||||
|
dismissible?: boolean
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
dismiss: []
|
||||||
|
delete: []
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const { formatSharedInstanceUnavailable } = useSharedInstanceErrors()
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
deleteInstance: {
|
||||||
|
id: 'instance.locked.delete-button',
|
||||||
|
defaultMessage: 'Delete instance',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
+78
@@ -0,0 +1,78 @@
|
|||||||
|
<template>
|
||||||
|
<Admonition type="warning" :header="formatMessage(headerMessage)">
|
||||||
|
<span class="flex flex-wrap items-center gap-x-1.5 gap-y-1">
|
||||||
|
<span>{{ formatMessage(messages.sharedInstanceWrongAccountSignInAs) }}</span>
|
||||||
|
<span
|
||||||
|
v-if="sharedInstanceExpectedUser"
|
||||||
|
class="inline-flex max-w-full min-w-0 items-center gap-1.5 align-middle font-semibold text-contrast"
|
||||||
|
>
|
||||||
|
<Avatar
|
||||||
|
:src="sharedInstanceExpectedUser.avatarUrl"
|
||||||
|
:alt="sharedInstanceExpectedUsername"
|
||||||
|
:tint-by="sharedInstanceExpectedUser.tintBy"
|
||||||
|
size="20px"
|
||||||
|
circle
|
||||||
|
no-shadow
|
||||||
|
/>
|
||||||
|
<span class="min-w-0 truncate">{{ sharedInstanceExpectedUsername }}</span>
|
||||||
|
</span>
|
||||||
|
<span v-else class="font-semibold">{{ sharedInstanceExpectedUsername }}</span>
|
||||||
|
<span>{{ formatMessage(bodyMessage) }}</span>
|
||||||
|
</span>
|
||||||
|
</Admonition>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { Admonition, Avatar, useVIntl } from '@modrinth/ui'
|
||||||
|
import { useQuery } from '@tanstack/vue-query'
|
||||||
|
import { computed } from 'vue'
|
||||||
|
|
||||||
|
import { get_user } from '@/helpers/cache'
|
||||||
|
|
||||||
|
import { instanceAdmonitionsMessages as messages } from './instance-admonitions-messages'
|
||||||
|
import type { SharedInstanceRole } from './types'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
expectedUserId?: string | null
|
||||||
|
role?: SharedInstanceRole | null
|
||||||
|
signedOut?: boolean
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const expectedUserId = computed(() => props.expectedUserId ?? null)
|
||||||
|
const expectedUserQuery = useQuery({
|
||||||
|
queryKey: computed(() => ['user', expectedUserId.value]),
|
||||||
|
queryFn: async () => {
|
||||||
|
if (!expectedUserId.value) return null
|
||||||
|
|
||||||
|
return await get_user(expectedUserId.value, 'bypass').catch(() => null)
|
||||||
|
},
|
||||||
|
enabled: () => !!expectedUserId.value,
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
const sharedInstanceExpectedUser = computed(() => {
|
||||||
|
const user = expectedUserQuery.data.value
|
||||||
|
if (!user) return null
|
||||||
|
|
||||||
|
return {
|
||||||
|
username: user.username,
|
||||||
|
avatarUrl: user.avatar_url ?? undefined,
|
||||||
|
tintBy: user.id,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
const sharedInstanceExpectedUsername = computed(
|
||||||
|
() =>
|
||||||
|
sharedInstanceExpectedUser.value?.username ||
|
||||||
|
formatMessage(messages.sharedInstanceWrongAccountFallbackUsername),
|
||||||
|
)
|
||||||
|
const headerMessage = computed(() =>
|
||||||
|
props.signedOut
|
||||||
|
? messages.sharedInstanceSignedOutHeader
|
||||||
|
: messages.sharedInstanceWrongAccountHeader,
|
||||||
|
)
|
||||||
|
const bodyMessage = computed(() =>
|
||||||
|
props.role === 'owner'
|
||||||
|
? messages.sharedInstanceWrongAccountOwnerBody
|
||||||
|
: messages.sharedInstanceWrongAccountUserBody,
|
||||||
|
)
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
import type { StackedAdmonitionItem } from '@modrinth/ui'
|
||||||
|
|
||||||
|
export type InstanceAdmonitionKind =
|
||||||
|
| 'shared-instance-stale'
|
||||||
|
| 'shared-instance-unavailable'
|
||||||
|
| 'shared-instance-wrong-account'
|
||||||
|
|
||||||
|
export type InstanceAdmonitionItem = StackedAdmonitionItem & {
|
||||||
|
kind: InstanceAdmonitionKind
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SharedInstanceRole = 'owner' | 'member'
|
||||||
@@ -7,7 +7,6 @@ import {
|
|||||||
injectFilePicker,
|
injectFilePicker,
|
||||||
injectNotificationManager,
|
injectNotificationManager,
|
||||||
InstallationSettingsLayout,
|
InstallationSettingsLayout,
|
||||||
provideAppBackup,
|
|
||||||
provideInstallationSettings,
|
provideInstallationSettings,
|
||||||
useDebugLogger,
|
useDebugLogger,
|
||||||
useVIntl,
|
useVIntl,
|
||||||
@@ -16,24 +15,25 @@ import type { GameVersionTag, PlatformTag } from '@modrinth/utils'
|
|||||||
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||||
import { computed, ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
|
import SharedInstanceInstallationSettingsControls from '@/components/ui/shared-instances/SharedInstanceInstallationSettingsControls.vue'
|
||||||
|
import { useManagedContentPolicy } from '@/composables/instances/use-managed-content-policy'
|
||||||
import { trackEvent } from '@/helpers/analytics'
|
import { trackEvent } from '@/helpers/analytics'
|
||||||
import { get_project_versions, get_version } from '@/helpers/cache'
|
import { get_project_versions, get_version } from '@/helpers/cache'
|
||||||
import {
|
import {
|
||||||
install_duplicate_instance,
|
|
||||||
install_existing_instance,
|
install_existing_instance,
|
||||||
install_pack_to_existing_instance,
|
install_pack_to_existing_instance,
|
||||||
installJobInstanceId,
|
|
||||||
wait_for_install_job,
|
wait_for_install_job,
|
||||||
} from '@/helpers/install'
|
} from '@/helpers/install'
|
||||||
import {
|
import {
|
||||||
edit,
|
edit,
|
||||||
get_linked_modpack_info,
|
get_linked_modpack_info,
|
||||||
list,
|
unlink_shared_instance,
|
||||||
update_managed_modrinth_version,
|
update_managed_modrinth_version,
|
||||||
update_repair_modrinth,
|
update_repair_modrinth,
|
||||||
} from '@/helpers/instance'
|
} from '@/helpers/instance'
|
||||||
import { get_loader_versions } from '@/helpers/metadata'
|
import { get_loader_versions } from '@/helpers/metadata'
|
||||||
import { get_game_versions, get_loaders } from '@/helpers/tags'
|
import { get_game_versions, get_loaders } from '@/helpers/tags'
|
||||||
|
import { provideInstanceBackup } from '@/providers/instance-backup'
|
||||||
import { injectInstanceSettings } from '@/providers/instance-settings'
|
import { injectInstanceSettings } from '@/providers/instance-settings'
|
||||||
import { useTheming } from '@/store/state'
|
import { useTheming } from '@/store/state'
|
||||||
|
|
||||||
@@ -47,6 +47,7 @@ const debug = useDebugLogger('AppInstallationSettings')
|
|||||||
const themeStore = useTheming()
|
const themeStore = useTheming()
|
||||||
|
|
||||||
const { instance, offline, isMinecraftServer, onUnlinked, closeModal } = injectInstanceSettings()
|
const { instance, offline, isMinecraftServer, onUnlinked, closeModal } = injectInstanceSettings()
|
||||||
|
const managedContentPolicy = useManagedContentPolicy(instance)
|
||||||
const skipNonEssentialWarnings = computed(() =>
|
const skipNonEssentialWarnings = computed(() =>
|
||||||
themeStore.getFeatureFlag('skip_non_essential_warnings'),
|
themeStore.getFeatureFlag('skip_non_essential_warnings'),
|
||||||
)
|
)
|
||||||
@@ -111,9 +112,14 @@ debug('metadata queries configured', {
|
|||||||
const isModrinthLinkedModpack = computed(
|
const isModrinthLinkedModpack = computed(
|
||||||
() =>
|
() =>
|
||||||
instance.value.link?.type === 'modrinth_modpack' ||
|
instance.value.link?.type === 'modrinth_modpack' ||
|
||||||
instance.value.link?.type === 'server_project_modpack',
|
instance.value.link?.type === 'server_project_modpack' ||
|
||||||
|
(instance.value.link?.type === 'shared_instance' &&
|
||||||
|
!!instance.value.link.modpack_project_id &&
|
||||||
|
!!instance.value.link.modpack_version_id),
|
||||||
)
|
)
|
||||||
const isImportedModpack = computed(() => instance.value.link?.type === 'imported_modpack')
|
const isImportedModpack = computed(() => instance.value.link?.type === 'imported_modpack')
|
||||||
|
const isSharedInstanceManagedModpack = managedContentPolicy.isManagedModpack
|
||||||
|
const canUnlinkSharedInstance = managedContentPolicy.canUnlink
|
||||||
|
|
||||||
const modpackInfoQuery = useQuery({
|
const modpackInfoQuery = useQuery({
|
||||||
queryKey: computed(() => ['linkedModpackInfo', instance.value.id]),
|
queryKey: computed(() => ['linkedModpackInfo', instance.value.id]),
|
||||||
@@ -124,12 +130,43 @@ const modpackInfo = modpackInfoQuery.data
|
|||||||
|
|
||||||
const repairing = ref(false)
|
const repairing = ref(false)
|
||||||
const reinstalling = ref(false)
|
const reinstalling = ref(false)
|
||||||
|
const unlinkingSharedInstance = ref(false)
|
||||||
|
const installationSettingsBusy = computed(
|
||||||
|
() =>
|
||||||
|
instance.value.quarantined ||
|
||||||
|
instance.value.install_stage !== 'installed' ||
|
||||||
|
repairing.value ||
|
||||||
|
reinstalling.value ||
|
||||||
|
unlinkingSharedInstance.value ||
|
||||||
|
!!offline,
|
||||||
|
)
|
||||||
|
const installationSettingsBusyMessage = computed(() =>
|
||||||
|
instance.value.quarantined ? formatMessage(messages.locked) : null,
|
||||||
|
)
|
||||||
|
|
||||||
|
async function unlinkSharedInstance() {
|
||||||
|
unlinkingSharedInstance.value = true
|
||||||
|
try {
|
||||||
|
await unlink_shared_instance(instance.value.id)
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['sharedInstanceUsers', instance.value.id] })
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['linkedModpackInfo', instance.value.id] })
|
||||||
|
onUnlinked()
|
||||||
|
} catch (error) {
|
||||||
|
handleError(error)
|
||||||
|
} finally {
|
||||||
|
unlinkingSharedInstance.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
loaderVersion: {
|
loaderVersion: {
|
||||||
id: 'instance.settings.tabs.installation.loader-version',
|
id: 'instance.settings.tabs.installation.loader-version',
|
||||||
defaultMessage: '{loader} version',
|
defaultMessage: '{loader} version',
|
||||||
},
|
},
|
||||||
|
locked: {
|
||||||
|
id: 'instance.settings.tabs.installation.locked',
|
||||||
|
defaultMessage: 'Installation settings are unavailable while this instance is locked.',
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
function getManifest(loader: string) {
|
function getManifest(loader: string) {
|
||||||
@@ -162,27 +199,7 @@ async function installLocalModpackFromPicker() {
|
|||||||
return !!completed
|
return !!completed
|
||||||
}
|
}
|
||||||
|
|
||||||
provideAppBackup({
|
provideInstanceBackup(instance)
|
||||||
async createBackup() {
|
|
||||||
debug('createBackup: start', {
|
|
||||||
instanceId: instance.value.id,
|
|
||||||
instanceName: instance.value.name,
|
|
||||||
})
|
|
||||||
const allInstances = await list()
|
|
||||||
const prefix = `${instance.value.name} - Backup #`
|
|
||||||
const existingNums = allInstances
|
|
||||||
.filter((p) => p.name.startsWith(prefix))
|
|
||||||
.map((p) => parseInt(p.name.slice(prefix.length), 10))
|
|
||||||
.filter((n) => !isNaN(n))
|
|
||||||
const nextNum = existingNums.length > 0 ? Math.max(...existingNums) + 1 : 1
|
|
||||||
const job = await install_duplicate_instance(instance.value.id)
|
|
||||||
const newInstanceId = installJobInstanceId(job)
|
|
||||||
if (newInstanceId) {
|
|
||||||
await edit(newInstanceId, { name: `${prefix}${nextNum}` })
|
|
||||||
}
|
|
||||||
debug('createBackup: done', { newInstanceId, backupName: `${prefix}${nextNum}` })
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
provideInstallationSettings({
|
provideInstallationSettings({
|
||||||
closeSettings: closeModal,
|
closeSettings: closeModal,
|
||||||
@@ -208,14 +225,14 @@ provideInstallationSettings({
|
|||||||
}
|
}
|
||||||
return rows
|
return rows
|
||||||
}),
|
}),
|
||||||
isLinked: computed(() => isModrinthLinkedModpack.value || isImportedModpack.value),
|
isLinked: computed(
|
||||||
isBusy: computed(
|
|
||||||
() =>
|
() =>
|
||||||
instance.value.install_stage !== 'installed' ||
|
isModrinthLinkedModpack.value ||
|
||||||
repairing.value ||
|
isImportedModpack.value ||
|
||||||
reinstalling.value ||
|
isSharedInstanceManagedModpack.value,
|
||||||
!!offline,
|
|
||||||
),
|
),
|
||||||
|
isBusy: installationSettingsBusy,
|
||||||
|
busyMessage: installationSettingsBusyMessage,
|
||||||
skipNonEssentialWarnings,
|
skipNonEssentialWarnings,
|
||||||
modpack: computed(() => {
|
modpack: computed(() => {
|
||||||
if (isImportedModpack.value && instance.value.link?.type === 'imported_modpack') {
|
if (isImportedModpack.value && instance.value.link?.type === 'imported_modpack') {
|
||||||
@@ -452,14 +469,28 @@ provideInstallationSettings({
|
|||||||
isServer: false,
|
isServer: false,
|
||||||
isApp: true,
|
isApp: true,
|
||||||
showModpackVersionActions: computed(
|
showModpackVersionActions: computed(
|
||||||
() => isModrinthLinkedModpack.value && !isMinecraftServer.value,
|
() =>
|
||||||
|
isModrinthLinkedModpack.value &&
|
||||||
|
!isMinecraftServer.value &&
|
||||||
|
!isSharedInstanceManagedModpack.value,
|
||||||
),
|
),
|
||||||
isLocalFile: isImportedModpack,
|
isLocalFile: isImportedModpack,
|
||||||
|
isManagedModpack: isSharedInstanceManagedModpack,
|
||||||
|
managedModpackWarning: managedContentPolicy.managedModpackWarning,
|
||||||
repairing,
|
repairing,
|
||||||
reinstalling,
|
reinstalling,
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<InstallationSettingsLayout />
|
<InstallationSettingsLayout>
|
||||||
|
<template #extra>
|
||||||
|
<SharedInstanceInstallationSettingsControls
|
||||||
|
:can-unlink="canUnlinkSharedInstance"
|
||||||
|
:busy="installationSettingsBusy"
|
||||||
|
:unlinking="unlinkingSharedInstance"
|
||||||
|
:unlink="unlinkSharedInstance"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</InstallationSettingsLayout>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<SharedInstanceInstallationSettingsControls
|
||||||
|
can-unpublish
|
||||||
|
:busy="isBusy"
|
||||||
|
:unpublishing="unpublishing"
|
||||||
|
:unpublish="unpublishSharedInstance"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { injectNotificationManager } from '@modrinth/ui'
|
||||||
|
import { useQueryClient } from '@tanstack/vue-query'
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
|
import SharedInstanceInstallationSettingsControls from '@/components/ui/shared-instances/SharedInstanceInstallationSettingsControls.vue'
|
||||||
|
import { unpublish_shared_instance } from '@/helpers/instance'
|
||||||
|
import { injectInstanceSettings } from '@/providers/instance-settings'
|
||||||
|
|
||||||
|
const { instance, offline, onUnlinked } = injectInstanceSettings()
|
||||||
|
const { handleError } = injectNotificationManager()
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const unpublishing = ref(false)
|
||||||
|
const isBusy = computed(
|
||||||
|
() => instance.value.install_stage !== 'installed' || unpublishing.value || !!offline,
|
||||||
|
)
|
||||||
|
|
||||||
|
async function unpublishSharedInstance() {
|
||||||
|
unpublishing.value = true
|
||||||
|
try {
|
||||||
|
await unpublish_shared_instance(instance.value.id)
|
||||||
|
queryClient.setQueryData(['sharedInstanceUsers', instance.value.id], [])
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['linkedModpackInfo', instance.value.id] })
|
||||||
|
onUnlinked()
|
||||||
|
} catch (error) {
|
||||||
|
handleError(error)
|
||||||
|
} finally {
|
||||||
|
unpublishing.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
+144
@@ -0,0 +1,144 @@
|
|||||||
|
<template>
|
||||||
|
<NewModal ref="modal" :header="formatMessage(messages.header)" max-width="544px" no-padding>
|
||||||
|
<div class="grid grid-cols-[1fr_auto] gap-2.5 h-[154px] px-7 pt-4 pb-1 pr-9">
|
||||||
|
<div class="flex flex-col gap-2.5 items-start justify-center h-min mt-5">
|
||||||
|
<div class="font-semibold text-xl text-contrast">
|
||||||
|
{{ formatMessage(messages.descriptionHeader) }}
|
||||||
|
</div>
|
||||||
|
<div class="text-secondary leading-6">
|
||||||
|
{{ formatMessage(messages.description) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="relative h-full w-[96px] overflow-hidden mx-3">
|
||||||
|
<div class="absolute top-0 left-0 z-0 w-full flex grow-0 flex-col items-end p-0">
|
||||||
|
<img :src="steveImage" alt="" class="self-stretch" />
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="absolute left-0 bottom-0 z-10 order-1 h-6 w-[120px] shrink-0 grow-0 bg-[linear-gradient(180deg,rgba(39,41,46,0)_0%,#27292E_80%,#27292E_100%)]"
|
||||||
|
></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-6 px-6 pb-6">
|
||||||
|
<div class="flex justify-end gap-2">
|
||||||
|
<ButtonStyled>
|
||||||
|
<a class="w-full !shadow-none" href="https://support.modrinth.com" @click="modal?.hide()">
|
||||||
|
<MessagesSquareIcon />
|
||||||
|
{{ formatMessage(messages.getSupport) }}
|
||||||
|
</a>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button class="w-full !shadow-none" :disabled="loadingSignIn" @click="signIn">
|
||||||
|
<SpinnerIcon v-if="loadingSignIn" class="animate-spin" />
|
||||||
|
<svg
|
||||||
|
v-else
|
||||||
|
width="20"
|
||||||
|
height="20"
|
||||||
|
viewBox="0 0 20 20"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<rect width="9.25" height="9.25" fill="black" fill-opacity="0.9" />
|
||||||
|
<rect x="10.75" width="9.25" height="9.25" fill="black" fill-opacity="0.9" />
|
||||||
|
<rect y="10.75" width="9.25" height="9.25" fill="black" fill-opacity="0.9" />
|
||||||
|
<rect
|
||||||
|
x="10.75"
|
||||||
|
y="10.75"
|
||||||
|
width="9.25"
|
||||||
|
height="9.25"
|
||||||
|
fill="black"
|
||||||
|
fill-opacity="0.9"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
{{ formatMessage(messages.signIn) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
<p class="m-0 text-center text-sm text-secondary">
|
||||||
|
{{ formatMessage(messages.dontHaveAccount) }}
|
||||||
|
<a
|
||||||
|
class="text-blue font-medium hover:underline"
|
||||||
|
href="https://www.minecraft.net/en-us/store/minecraft-java-bedrock-edition-pc"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.getMinecraft) }}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</NewModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { MessagesSquareIcon, SpinnerIcon } from '@modrinth/assets'
|
||||||
|
import { ButtonStyled, defineMessages, NewModal, useVIntl } from '@modrinth/ui'
|
||||||
|
import { inject, type Ref, ref } from 'vue'
|
||||||
|
|
||||||
|
import steveImage from '@/assets/steve-look-up-left.webp'
|
||||||
|
import type AccountsCard from '@/components/ui/AccountsCard.vue'
|
||||||
|
import { trackEvent } from '@/helpers/analytics'
|
||||||
|
import { login as loginFlow, set_default_user } from '@/helpers/auth.js'
|
||||||
|
import { handleSevereError } from '@/store/error.js'
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const accountsCard = inject('accountsCard') as Ref<InstanceType<typeof AccountsCard> | null>
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
header: {
|
||||||
|
id: 'minecraft-required.header',
|
||||||
|
defaultMessage: 'Minecraft required',
|
||||||
|
},
|
||||||
|
descriptionHeader: {
|
||||||
|
id: 'minecraft-required.description-header',
|
||||||
|
defaultMessage: 'Sign in to a Microsoft account',
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
id: 'minecraft-required.description',
|
||||||
|
defaultMessage:
|
||||||
|
'You need a Microsoft account that owns Minecraft before you can launch and play.',
|
||||||
|
},
|
||||||
|
getSupport: {
|
||||||
|
id: 'minecraft-required.get-support',
|
||||||
|
defaultMessage: 'Get support',
|
||||||
|
},
|
||||||
|
signIn: {
|
||||||
|
id: 'minecraft-required.sign-in',
|
||||||
|
defaultMessage: 'Sign in to Microsoft',
|
||||||
|
},
|
||||||
|
dontHaveAccount: {
|
||||||
|
id: 'minecraft-required.dont-have-account',
|
||||||
|
defaultMessage: 'Don’t have an account?',
|
||||||
|
},
|
||||||
|
getMinecraft: {
|
||||||
|
id: 'minecraft-required.get-minecraft',
|
||||||
|
defaultMessage: 'Get Minecraft',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const modal = ref<InstanceType<typeof NewModal>>()
|
||||||
|
const loadingSignIn = ref(false)
|
||||||
|
|
||||||
|
function show() {
|
||||||
|
modal.value?.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
async function signIn() {
|
||||||
|
loadingSignIn.value = true
|
||||||
|
|
||||||
|
try {
|
||||||
|
const loggedIn = await loginFlow()
|
||||||
|
if (!loggedIn) return
|
||||||
|
|
||||||
|
await set_default_user(loggedIn.profile.id)
|
||||||
|
await accountsCard.value?.refreshValues()
|
||||||
|
await trackEvent('AccountLogIn', { source: 'MinecraftRequiredModal' })
|
||||||
|
modal.value?.hide()
|
||||||
|
} catch (error) {
|
||||||
|
handleSevereError(error)
|
||||||
|
} finally {
|
||||||
|
loadingSignIn.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
show,
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
<script setup lang="ts">
|
|
||||||
import { LogInIcon, SpinnerIcon } from '@modrinth/assets'
|
|
||||||
import { ref } from 'vue'
|
|
||||||
|
|
||||||
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
|
|
||||||
|
|
||||||
defineProps({
|
|
||||||
onFlowCancel: {
|
|
||||||
type: Function,
|
|
||||||
default() {
|
|
||||||
return async () => {}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const modal = ref()
|
|
||||||
|
|
||||||
function show() {
|
|
||||||
modal.value.show()
|
|
||||||
}
|
|
||||||
|
|
||||||
function hide() {
|
|
||||||
modal.value.hide()
|
|
||||||
}
|
|
||||||
|
|
||||||
defineExpose({ show, hide })
|
|
||||||
</script>
|
|
||||||
<template>
|
|
||||||
<ModalWrapper ref="modal" @hide="onFlowCancel">
|
|
||||||
<template #title>
|
|
||||||
<span class="items-center gap-2 text-lg font-extrabold text-contrast">
|
|
||||||
<LogInIcon /> Sign in
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div class="flex justify-center gap-2">
|
|
||||||
<SpinnerIcon class="w-12 h-12 animate-spin" />
|
|
||||||
</div>
|
|
||||||
<p class="text-sm text-secondary">
|
|
||||||
Please sign in at the browser window that just opened to continue.
|
|
||||||
</p>
|
|
||||||
</ModalWrapper>
|
|
||||||
</template>
|
|
||||||
@@ -1,15 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<NewModal ref="modal" :header="formatMessage(messages.installToPlay)" :closable="true">
|
<NewModal
|
||||||
<div v-if="requiredContentProject" class="flex flex-col gap-6 max-w-[500px]">
|
ref="modal"
|
||||||
<Admonition type="info" :header="formatMessage(messages.contentRequired)">
|
:header="formatMessage(messages.installToPlay)"
|
||||||
{{ formatMessage(messages.serverRequiresMods) }}
|
:closable="true"
|
||||||
</Admonition>
|
:on-hide="show_ads_window"
|
||||||
|
max-width="544px"
|
||||||
|
width="544px"
|
||||||
|
>
|
||||||
|
<div v-if="requiredContentProject" class="flex w-full flex-col gap-6">
|
||||||
|
<p class="m-0 text-primary">
|
||||||
|
{{ formatMessage(messages.inviteWarning) }}
|
||||||
|
</p>
|
||||||
|
|
||||||
<div class="flex flex-col gap-1">
|
<div class="flex flex-col gap-2.5">
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex items-center justify-between">
|
||||||
<span class="font-semibold text-contrast">{{
|
<span class="font-semibold text-contrast">
|
||||||
formatMessage(messages.requiredModpack)
|
{{ formatMessage(messages.sharedInstance) }}
|
||||||
}}</span>
|
</span>
|
||||||
|
|
||||||
<ButtonStyled type="transparent">
|
<ButtonStyled type="transparent">
|
||||||
<button @click="openViewContents">
|
<button @click="openViewContents">
|
||||||
@@ -19,14 +26,16 @@
|
|||||||
</ButtonStyled>
|
</ButtonStyled>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex items-center gap-3 rounded-xl bg-surface-2 p-3">
|
<div class="flex items-center gap-3 rounded-2xl bg-surface-2 p-3">
|
||||||
<Avatar
|
<Avatar
|
||||||
:src="requiredContentProject.icon_url"
|
:src="requiredContentProject.icon_url"
|
||||||
:alt="requiredContentProject.title"
|
:alt="requiredContentProject.title"
|
||||||
size="48px"
|
size="56px"
|
||||||
|
no-shadow
|
||||||
|
class="!rounded-2xl"
|
||||||
/>
|
/>
|
||||||
<div class="flex flex-col gap-0.5">
|
<div class="flex min-w-0 flex-col gap-0.5">
|
||||||
<span class="font-semibold text-contrast">
|
<span class="truncate font-semibold text-contrast">
|
||||||
<template v-if="usingCustomModpack && modpackVersion">
|
<template v-if="usingCustomModpack && modpackVersion">
|
||||||
{{ modpackVersion.name }}
|
{{ modpackVersion.name }}
|
||||||
</template>
|
</template>
|
||||||
@@ -34,7 +43,7 @@
|
|||||||
{{ requiredContentProject.title }}
|
{{ requiredContentProject.title }}
|
||||||
</template>
|
</template>
|
||||||
</span>
|
</span>
|
||||||
<span class="text-sm text-secondary">
|
<span class="truncate text-sm font-medium text-secondary">
|
||||||
{{ loaderDisplay }} {{ requiredContentProject.game_versions?.[0] }}
|
{{ loaderDisplay }} {{ requiredContentProject.game_versions?.[0] }}
|
||||||
<template v-if="modCount">
|
<template v-if="modCount">
|
||||||
· {{ formatMessage(messages.modCount, { count: modCount }) }}
|
· {{ formatMessage(messages.modCount, { count: modCount }) }}
|
||||||
@@ -43,24 +52,105 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
<template #actions>
|
<Admonition
|
||||||
<div class="flex justify-end gap-2">
|
v-if="hasExternalFiles"
|
||||||
<ButtonStyled>
|
type="warning"
|
||||||
<button @click="handleDecline">
|
:header="formatMessage(messages.unknownFilesWarning)"
|
||||||
<XIcon />
|
>
|
||||||
{{ formatMessage(commonMessages.cancelButton) }}
|
{{ formatMessage(messages.unknownFilesDescription) }}
|
||||||
</button>
|
</Admonition>
|
||||||
</ButtonStyled>
|
|
||||||
<ButtonStyled color="brand">
|
<div v-if="hasExternalFiles" class="relative w-full">
|
||||||
<button @click="handleAccept">
|
<div
|
||||||
<DownloadIcon />
|
ref="externalFileTable"
|
||||||
{{ formatMessage(messages.installButton) }}
|
class="max-h-[242px] overflow-y-auto rounded-2xl"
|
||||||
</button>
|
@scroll="checkTableScrollState"
|
||||||
</ButtonStyled>
|
>
|
||||||
|
<Table
|
||||||
|
:columns="externalFileColumns"
|
||||||
|
:data="externalFileRows"
|
||||||
|
row-key="id"
|
||||||
|
virtualized
|
||||||
|
:virtual-row-height="48"
|
||||||
|
class="shadow-sm"
|
||||||
|
>
|
||||||
|
<template #cell-name="{ value }">
|
||||||
|
<span class="block truncate" :title="String(value)">{{ value }}</span>
|
||||||
|
</template>
|
||||||
|
</Table>
|
||||||
|
</div>
|
||||||
|
<Transition
|
||||||
|
enter-active-class="transition-all duration-200 ease-out"
|
||||||
|
enter-from-class="opacity-0 max-h-0"
|
||||||
|
enter-to-class="opacity-100 max-h-2"
|
||||||
|
leave-active-class="transition-all duration-200 ease-in"
|
||||||
|
leave-from-class="opacity-100 max-h-2"
|
||||||
|
leave-to-class="opacity-0 max-h-0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="showTableTopFade"
|
||||||
|
class="pointer-events-none absolute left-0 right-0 top-0 z-10 h-2 bg-gradient-to-b from-bg-raised to-transparent"
|
||||||
|
/>
|
||||||
|
</Transition>
|
||||||
|
<Transition
|
||||||
|
enter-active-class="transition-all duration-200 ease-out"
|
||||||
|
enter-from-class="opacity-0 max-h-0"
|
||||||
|
enter-to-class="opacity-100 max-h-2"
|
||||||
|
leave-active-class="transition-all duration-200 ease-in"
|
||||||
|
leave-from-class="opacity-100 max-h-2"
|
||||||
|
leave-to-class="opacity-0 max-h-0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="showTableBottomFade"
|
||||||
|
class="pointer-events-none absolute bottom-0 left-0 right-0 z-10 h-2 bg-gradient-to-t from-bg-raised to-transparent"
|
||||||
|
/>
|
||||||
|
</Transition>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
|
||||||
|
<p v-if="hasExternalFiles" class="m-0 text-primary">
|
||||||
|
{{ formatMessage(messages.reviewedFiles) }}
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="flex w-full items-center justify-between gap-2">
|
||||||
|
<ButtonStyled type="transparent" color="red">
|
||||||
|
<button @click="handleReport">
|
||||||
|
<ReportIcon />
|
||||||
|
{{ formatMessage(commonMessages.reportButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<template v-if="hasExternalFiles">
|
||||||
|
<ButtonStyled type="transparent" color="orange">
|
||||||
|
<button @click="handleAccept">
|
||||||
|
{{ formatMessage(messages.installAnyway) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button @click="handleDecline">
|
||||||
|
<BanIcon />
|
||||||
|
{{ formatMessage(messages.dontInstall) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<ButtonStyled>
|
||||||
|
<button @click="handleDecline">
|
||||||
|
<XIcon />
|
||||||
|
{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button @click="handleAccept">
|
||||||
|
<DownloadIcon />
|
||||||
|
{{ formatMessage(messages.installButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</NewModal>
|
</NewModal>
|
||||||
|
|
||||||
<ModpackContentModal
|
<ModpackContentModal
|
||||||
@@ -72,33 +162,56 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { Labrinth } from '@modrinth/api-client'
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
import { DownloadIcon, EyeIcon, XIcon } from '@modrinth/assets'
|
import { BanIcon, DownloadIcon, EyeIcon, ReportIcon, XIcon } from '@modrinth/assets'
|
||||||
import type { ContentItem } from '@modrinth/ui'
|
|
||||||
import {
|
import {
|
||||||
Admonition,
|
Admonition,
|
||||||
Avatar,
|
Avatar,
|
||||||
ButtonStyled,
|
ButtonStyled,
|
||||||
commonMessages,
|
commonMessages,
|
||||||
|
type ContentItem,
|
||||||
defineMessages,
|
defineMessages,
|
||||||
formatLoader,
|
formatLoader,
|
||||||
ModpackContentModal,
|
ModpackContentModal,
|
||||||
NewModal,
|
NewModal,
|
||||||
|
Table,
|
||||||
|
type TableColumn,
|
||||||
|
useScrollIndicator,
|
||||||
useVIntl,
|
useVIntl,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { computed, ref } from 'vue'
|
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||||
|
import { computed, nextTick, ref } from 'vue'
|
||||||
|
|
||||||
import { hide_ads_window, show_ads_window } from '@/helpers/ads'
|
import { hide_ads_window, show_ads_window } from '@/helpers/ads'
|
||||||
import { get_project, get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
|
import { get_project, get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
|
||||||
import { injectServerInstall } from '@/providers/server-install'
|
import { injectServerInstall } from '@/providers/server-install'
|
||||||
|
|
||||||
|
type ExternalFileColumn = 'name'
|
||||||
|
type ExternalFileRow = {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
const modal = ref<InstanceType<typeof NewModal>>()
|
const modal = ref<InstanceType<typeof NewModal>>()
|
||||||
const modpackVersionId = ref<string | null>(null)
|
const modpackVersionId = ref<string | null>(null)
|
||||||
const modpackVersion = ref<Labrinth.Versions.v2.Version | null>(null)
|
const modpackVersion = ref<Labrinth.Versions.v2.Version | null>(null)
|
||||||
const project = ref<Labrinth.Projects.v3.Project | null>(null)
|
const project = ref<Labrinth.Projects.v3.Project | null>(null)
|
||||||
const requiredContentProject = ref<Labrinth.Projects.v2.Project | null>(null)
|
const requiredContentProject = ref<Labrinth.Projects.v2.Project | null>(null)
|
||||||
|
const externalFiles = ref<string[]>([])
|
||||||
|
const externalFileTable = ref<HTMLElement | null>(null)
|
||||||
const onInstallComplete = ref<() => void>(() => {})
|
const onInstallComplete = ref<() => void>(() => {})
|
||||||
const { formatMessage } = useVIntl()
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
showExternalWarnings?: boolean
|
||||||
|
}>()
|
||||||
|
|
||||||
const { installServerProject, startInstallingServer, stopInstallingServer } = injectServerInstall()
|
const { installServerProject, startInstallingServer, stopInstallingServer } = injectServerInstall()
|
||||||
|
const {
|
||||||
|
showTopFade: showTableTopFade,
|
||||||
|
showBottomFade: showTableBottomFade,
|
||||||
|
checkScrollState: checkTableScrollState,
|
||||||
|
forceCheck: forceCheckTableScroll,
|
||||||
|
} = useScrollIndicator(externalFileTable)
|
||||||
|
|
||||||
const usingCustomModpack = computed(() => {
|
const usingCustomModpack = computed(() => {
|
||||||
return requiredContentProject.value?.id === project.value?.id
|
return requiredContentProject.value?.id === project.value?.id
|
||||||
@@ -111,13 +224,36 @@ const loaderDisplay = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const modCount = computed(() => modpackVersion.value?.dependencies?.length)
|
const modCount = computed(() => modpackVersion.value?.dependencies?.length)
|
||||||
|
const hasExternalFiles = computed(
|
||||||
|
() => Boolean(props.showExternalWarnings) && externalFiles.value.length > 0,
|
||||||
|
)
|
||||||
|
const externalFileRows = computed<ExternalFileRow[]>(() =>
|
||||||
|
externalFiles.value.map((name, index) => ({
|
||||||
|
id: `${index}-${name}`,
|
||||||
|
name,
|
||||||
|
})),
|
||||||
|
)
|
||||||
|
|
||||||
async function fetchData(versionId: string) {
|
async function fetchData(versionId: string) {
|
||||||
// cache is making version null for some reason so bypassing for now
|
// cache is making version null for some reason so bypassing for now
|
||||||
modpackVersion.value = await get_version(versionId, 'bypass')
|
const version = await get_version(versionId, 'bypass')
|
||||||
|
modpackVersion.value = version
|
||||||
|
|
||||||
if (modpackVersion.value?.project_id) {
|
if (version?.project_id) {
|
||||||
requiredContentProject.value = await get_project(modpackVersion.value.project_id, 'bypass')
|
requiredContentProject.value = await get_project(version.project_id, 'bypass')
|
||||||
|
externalFiles.value = [
|
||||||
|
...new Set(
|
||||||
|
(version.dependencies ?? [])
|
||||||
|
.filter(
|
||||||
|
(dependency) =>
|
||||||
|
dependency.dependency_type === 'embedded' &&
|
||||||
|
!dependency.project_id &&
|
||||||
|
!dependency.version_id &&
|
||||||
|
dependency.file_name,
|
||||||
|
)
|
||||||
|
.flatMap((dependency) => (dependency.file_name ? [dependency.file_name] : [])),
|
||||||
|
),
|
||||||
|
].sort((left, right) => left.localeCompare(right))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,6 +275,12 @@ function handleDecline() {
|
|||||||
hide()
|
hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function handleReport() {
|
||||||
|
if (project.value?.id) {
|
||||||
|
openUrl(`https://modrinth.com/report?item=project&itemID=${project.value.id}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const modpackContentModal = ref<InstanceType<typeof ModpackContentModal>>()
|
const modpackContentModal = ref<InstanceType<typeof ModpackContentModal>>()
|
||||||
|
|
||||||
async function openViewContents() {
|
async function openViewContents() {
|
||||||
@@ -217,17 +359,19 @@ async function show(
|
|||||||
modpackVersionId.value = modpackVersionIdVal
|
modpackVersionId.value = modpackVersionIdVal
|
||||||
modpackVersion.value = null
|
modpackVersion.value = null
|
||||||
requiredContentProject.value = null
|
requiredContentProject.value = null
|
||||||
|
externalFiles.value = []
|
||||||
onInstallComplete.value = callback
|
onInstallComplete.value = callback
|
||||||
|
|
||||||
if (modpackVersionIdVal) await fetchData(modpackVersionIdVal)
|
if (modpackVersionIdVal) await fetchData(modpackVersionIdVal)
|
||||||
|
|
||||||
hide_ads_window()
|
hide_ads_window()
|
||||||
modal.value?.show(e)
|
modal.value?.show(e)
|
||||||
|
await nextTick()
|
||||||
|
forceCheckTableScroll()
|
||||||
}
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
modal.value?.hide()
|
modal.value?.hide()
|
||||||
show_ads_window()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const messages = defineMessages({
|
const messages = defineMessages({
|
||||||
@@ -235,22 +379,10 @@ const messages = defineMessages({
|
|||||||
id: 'app.modal.install-to-play.header',
|
id: 'app.modal.install-to-play.header',
|
||||||
defaultMessage: 'Install to play',
|
defaultMessage: 'Install to play',
|
||||||
},
|
},
|
||||||
sharedServerInstance: {
|
inviteWarning: {
|
||||||
id: 'app.modal.install-to-play.shared-server-instance',
|
id: 'app.modal.install-to-play.invite-warning',
|
||||||
defaultMessage: 'Shared server instance',
|
|
||||||
},
|
|
||||||
contentRequired: {
|
|
||||||
id: 'app.modal.install-to-play.content-required',
|
|
||||||
defaultMessage: 'Content required',
|
|
||||||
},
|
|
||||||
serverRequiresMods: {
|
|
||||||
id: 'app.modal.install-to-play.server-requires-mods',
|
|
||||||
defaultMessage:
|
defaultMessage:
|
||||||
'This server requires mods to play. Click Install to set up the required files from Modrinth, then launch directly into the server.',
|
'This invite was created by another Modrinth user, not Modrinth. Only accept invites from people you trust.',
|
||||||
},
|
|
||||||
requiredModpack: {
|
|
||||||
id: 'app.modal.install-to-play.required-modpack',
|
|
||||||
defaultMessage: 'Required modpack',
|
|
||||||
},
|
},
|
||||||
sharedInstance: {
|
sharedInstance: {
|
||||||
id: 'app.modal.install-to-play.shared-instance',
|
id: 'app.modal.install-to-play.shared-instance',
|
||||||
@@ -268,7 +400,41 @@ const messages = defineMessages({
|
|||||||
id: 'app.modal.install-to-play.view-contents',
|
id: 'app.modal.install-to-play.view-contents',
|
||||||
defaultMessage: 'View contents',
|
defaultMessage: 'View contents',
|
||||||
},
|
},
|
||||||
|
unknownFilesWarning: {
|
||||||
|
id: 'app.modal.install-to-play.unknown-files-warning',
|
||||||
|
defaultMessage: 'Unknown files warning',
|
||||||
|
},
|
||||||
|
unknownFilesDescription: {
|
||||||
|
id: 'app.modal.install-to-play.unknown-files-description',
|
||||||
|
defaultMessage:
|
||||||
|
'This server modpack contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust.',
|
||||||
|
},
|
||||||
|
unrecognizedFiles: {
|
||||||
|
id: 'app.modal.install-to-play.unrecognized-files',
|
||||||
|
defaultMessage: 'Unrecognized files',
|
||||||
|
},
|
||||||
|
reviewedFiles: {
|
||||||
|
id: 'app.modal.install-to-play.reviewed-files',
|
||||||
|
defaultMessage:
|
||||||
|
'A file is only reviewed if it’s published to Modrinth, regardless of its file format (including .mrpack).',
|
||||||
|
},
|
||||||
|
installAnyway: {
|
||||||
|
id: 'app.modal.install-to-play.install-anyway',
|
||||||
|
defaultMessage: 'Install anyway',
|
||||||
|
},
|
||||||
|
dontInstall: {
|
||||||
|
id: 'app.modal.install-to-play.external-files-dont-install',
|
||||||
|
defaultMessage: "Don't install",
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const externalFileColumns = computed<TableColumn<ExternalFileColumn>[]>(() => [
|
||||||
|
{
|
||||||
|
key: 'name',
|
||||||
|
label: formatMessage(messages.unrecognizedFiles),
|
||||||
|
cellClass: '!h-12',
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
defineExpose({ show, hide })
|
defineExpose({ show, hide })
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import {
|
|||||||
CoffeeIcon,
|
CoffeeIcon,
|
||||||
InfoIcon,
|
InfoIcon,
|
||||||
MonitorIcon,
|
MonitorIcon,
|
||||||
|
UsersIcon,
|
||||||
WrenchIcon,
|
WrenchIcon,
|
||||||
} from '@modrinth/assets'
|
} from '@modrinth/assets'
|
||||||
import {
|
import {
|
||||||
@@ -25,6 +26,7 @@ import GeneralSettings from '@/components/ui/instance_settings/GeneralSettings.v
|
|||||||
import HooksSettings from '@/components/ui/instance_settings/HooksSettings.vue'
|
import HooksSettings from '@/components/ui/instance_settings/HooksSettings.vue'
|
||||||
import InstallationSettings from '@/components/ui/instance_settings/InstallationSettings.vue'
|
import InstallationSettings from '@/components/ui/instance_settings/InstallationSettings.vue'
|
||||||
import JavaSettings from '@/components/ui/instance_settings/JavaSettings.vue'
|
import JavaSettings from '@/components/ui/instance_settings/JavaSettings.vue'
|
||||||
|
import SharingSettings from '@/components/ui/instance_settings/SharingSettings.vue'
|
||||||
import WindowSettings from '@/components/ui/instance_settings/WindowSettings.vue'
|
import WindowSettings from '@/components/ui/instance_settings/WindowSettings.vue'
|
||||||
import { get_project_v3 } from '@/helpers/cache'
|
import { get_project_v3 } from '@/helpers/cache'
|
||||||
import { get_linked_modpack_info } from '@/helpers/instance'
|
import { get_linked_modpack_info } from '@/helpers/instance'
|
||||||
@@ -97,6 +99,15 @@ const tabs = computed<TabbedModalTab[]>(() => [
|
|||||||
icon: WrenchIcon,
|
icon: WrenchIcon,
|
||||||
content: InstallationSettings,
|
content: InstallationSettings,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: defineMessage({
|
||||||
|
id: 'instance.settings.tabs.sharing',
|
||||||
|
defaultMessage: 'Sharing',
|
||||||
|
}),
|
||||||
|
icon: UsersIcon,
|
||||||
|
content: SharingSettings,
|
||||||
|
shown: props.instance.shared_instance?.role === 'owner' && !props.instance.quarantined,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: defineMessage({
|
name: defineMessage({
|
||||||
id: 'instance.settings.tabs.window',
|
id: 'instance.settings.tabs.window',
|
||||||
|
|||||||
@@ -0,0 +1,265 @@
|
|||||||
|
<template>
|
||||||
|
<NewModal
|
||||||
|
ref="modal"
|
||||||
|
:header="formatMessage(authenticating ? messages.signingInHeader : messages.header)"
|
||||||
|
:on-hide="handleHide"
|
||||||
|
no-padding
|
||||||
|
max-width="548px"
|
||||||
|
width="100%"
|
||||||
|
>
|
||||||
|
<div v-if="authenticating === null" class="flex w-full flex-col gap-6 p-6">
|
||||||
|
<div class="flex flex-col gap-2 px-3">
|
||||||
|
<h2 class="m-0 text-xl font-semibold leading-7 text-contrast">
|
||||||
|
{{ formatMessage(messages.signInHeading) }}
|
||||||
|
</h2>
|
||||||
|
<p class="m-0 text-base leading-6 text-primary">
|
||||||
|
{{ formatMessage(messages.description) }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-6">
|
||||||
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
||||||
|
<ButtonStyled>
|
||||||
|
<button class="w-full !shadow-none" type="button" @click="authenticate('sign-up')">
|
||||||
|
<UserPlusIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(messages.createAccountButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button class="w-full" type="button" @click="authenticate('sign-in')">
|
||||||
|
<LogInIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(messages.signInButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="m-0 text-center text-base font-medium leading-6 text-primary">
|
||||||
|
<IntlFormatted :message-id="messages.supportPrompt">
|
||||||
|
<template #support="{ children }">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="inline cursor-pointer border-0 bg-transparent p-0 text-base font-medium leading-6 text-blue hover:underline"
|
||||||
|
@click="openSupport"
|
||||||
|
>
|
||||||
|
<component :is="() => children" />
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
</IntlFormatted>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-else class="flex w-full flex-col gap-6 p-6">
|
||||||
|
<div class="flex flex-col gap-2.5 px-3">
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<h2 class="m-0 text-xl font-semibold leading-7 text-contrast">
|
||||||
|
{{ formatMessage(messages.continueInBrowserHeading) }}
|
||||||
|
</h2>
|
||||||
|
<p class="m-0 text-base leading-6 text-primary">
|
||||||
|
{{ formatMessage(messages.browserDescription) }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-1.5 text-primary">
|
||||||
|
<SpinnerIcon aria-hidden="true" class="h-5 w-5 shrink-0 animate-spin" />
|
||||||
|
<span class="text-base leading-6">
|
||||||
|
{{ formatMessage(messages.waitingForBrowser) }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex flex-col gap-6">
|
||||||
|
<div class="grid grid-cols-1 gap-2 sm:grid-cols-2">
|
||||||
|
<ButtonStyled type="outlined">
|
||||||
|
<button class="w-full" type="button" @click="modal?.hide()">
|
||||||
|
<XIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(messages.cancelButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled>
|
||||||
|
<button
|
||||||
|
class="w-full !shadow-none"
|
||||||
|
type="button"
|
||||||
|
:disabled="reopeningBrowser"
|
||||||
|
@click="reopenBrowser"
|
||||||
|
>
|
||||||
|
<RefreshCwIcon aria-hidden="true" />
|
||||||
|
{{ formatMessage(messages.openBrowserAgainButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="m-0 text-center text-base font-medium leading-6 text-primary">
|
||||||
|
<IntlFormatted :message-id="messages.supportPrompt">
|
||||||
|
<template #support="{ children }">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="inline cursor-pointer border-0 bg-transparent p-0 text-base font-medium leading-6 text-blue hover:underline"
|
||||||
|
@click="openSupport"
|
||||||
|
>
|
||||||
|
<component :is="() => children" />
|
||||||
|
</button>
|
||||||
|
</template>
|
||||||
|
</IntlFormatted>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</NewModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { LogInIcon, RefreshCwIcon, SpinnerIcon, UserPlusIcon, XIcon } from '@modrinth/assets'
|
||||||
|
import { ButtonStyled, defineMessages, IntlFormatted, NewModal, useVIntl } from '@modrinth/ui'
|
||||||
|
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
import { cancelLogin, type ModrinthAuthFlow } from '@/helpers/mr_auth'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
requestAuth: (flow: ModrinthAuthFlow) => Promise<boolean>
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const modal = ref<InstanceType<typeof NewModal>>()
|
||||||
|
const authenticating = ref<ModrinthAuthFlow | null>(null)
|
||||||
|
const reopeningBrowser = ref(false)
|
||||||
|
let resolveShow: ((signedIn: boolean) => void) | undefined
|
||||||
|
let authenticationId = 0
|
||||||
|
let activeAuthentication: Promise<void> | undefined
|
||||||
|
|
||||||
|
function show(event?: MouseEvent) {
|
||||||
|
resetAuthentication(true)
|
||||||
|
resolveShow?.(false)
|
||||||
|
const modalInstance = modal.value
|
||||||
|
if (!modalInstance) return Promise.resolve(false)
|
||||||
|
|
||||||
|
return new Promise<boolean>((resolve) => {
|
||||||
|
resolveShow = resolve
|
||||||
|
modalInstance.show(event)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function showSigningIn(flow: ModrinthAuthFlow = 'sign-in', event?: MouseEvent) {
|
||||||
|
const result = show(event)
|
||||||
|
authenticate(flow)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
function finish(signedIn: boolean) {
|
||||||
|
resolveShow?.(signedIn)
|
||||||
|
resolveShow = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
function authenticate(flow: ModrinthAuthFlow) {
|
||||||
|
const id = ++authenticationId
|
||||||
|
authenticating.value = flow
|
||||||
|
|
||||||
|
const authentication = (async () => {
|
||||||
|
try {
|
||||||
|
if ((await props.requestAuth(flow)) && authenticationId === id) {
|
||||||
|
authenticating.value = null
|
||||||
|
activeAuthentication = undefined
|
||||||
|
finish(true)
|
||||||
|
modal.value?.hide()
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (authenticationId === id) {
|
||||||
|
authenticating.value = null
|
||||||
|
activeAuthentication = undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})()
|
||||||
|
|
||||||
|
activeAuthentication = authentication
|
||||||
|
}
|
||||||
|
|
||||||
|
async function reopenBrowser() {
|
||||||
|
const flow = authenticating.value
|
||||||
|
if (!flow || reopeningBrowser.value) return
|
||||||
|
|
||||||
|
reopeningBrowser.value = true
|
||||||
|
const previousAuthentication = activeAuthentication
|
||||||
|
++authenticationId
|
||||||
|
|
||||||
|
try {
|
||||||
|
await cancelLogin()
|
||||||
|
await previousAuthentication?.catch(() => undefined)
|
||||||
|
if (authenticating.value === flow) authenticate(flow)
|
||||||
|
} finally {
|
||||||
|
reopeningBrowser.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function resetAuthentication(cancelActive: boolean) {
|
||||||
|
const wasAuthenticating = authenticating.value !== null
|
||||||
|
++authenticationId
|
||||||
|
activeAuthentication = undefined
|
||||||
|
authenticating.value = null
|
||||||
|
reopeningBrowser.value = false
|
||||||
|
|
||||||
|
if (cancelActive && wasAuthenticating) void cancelLogin()
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleHide() {
|
||||||
|
resetAuthentication(true)
|
||||||
|
finish(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
function openSupport() {
|
||||||
|
openUrl('https://support.modrinth.com')
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
header: {
|
||||||
|
id: 'modal.modrinth-account-required.header',
|
||||||
|
defaultMessage: 'Account required',
|
||||||
|
},
|
||||||
|
signingInHeader: {
|
||||||
|
id: 'modal.modrinth-account-required.signing-in-header',
|
||||||
|
defaultMessage: 'Signing in',
|
||||||
|
},
|
||||||
|
signInHeading: {
|
||||||
|
id: 'modal.modrinth-account-required.sign-in-heading',
|
||||||
|
defaultMessage: 'Sign in to a Modrinth account',
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
id: 'modal.modrinth-account-required.description',
|
||||||
|
defaultMessage:
|
||||||
|
"You'll need to sign into your Modrinth account before you can use this feature.",
|
||||||
|
},
|
||||||
|
createAccountButton: {
|
||||||
|
id: 'modal.modrinth-account-required.create-account-button',
|
||||||
|
defaultMessage: 'Create an account',
|
||||||
|
},
|
||||||
|
signInButton: {
|
||||||
|
id: 'modal.modrinth-account-required.sign-in-button',
|
||||||
|
defaultMessage: 'Sign in to Modrinth',
|
||||||
|
},
|
||||||
|
continueInBrowserHeading: {
|
||||||
|
id: 'modal.modrinth-account-required.continue-in-browser-heading',
|
||||||
|
defaultMessage: 'Continue in your browser',
|
||||||
|
},
|
||||||
|
browserDescription: {
|
||||||
|
id: 'modal.modrinth-account-required.browser-description',
|
||||||
|
defaultMessage:
|
||||||
|
'A new tab opened to sign in. Complete the sign in there, then return to the app.',
|
||||||
|
},
|
||||||
|
waitingForBrowser: {
|
||||||
|
id: 'modal.modrinth-account-required.waiting-for-browser',
|
||||||
|
defaultMessage: 'Waiting for browser confirmation...',
|
||||||
|
},
|
||||||
|
cancelButton: {
|
||||||
|
id: 'modal.modrinth-account-required.cancel-button',
|
||||||
|
defaultMessage: 'Cancel',
|
||||||
|
},
|
||||||
|
openBrowserAgainButton: {
|
||||||
|
id: 'modal.modrinth-account-required.open-browser-again-button',
|
||||||
|
defaultMessage: 'Open browser again',
|
||||||
|
},
|
||||||
|
supportPrompt: {
|
||||||
|
id: 'modal.modrinth-account-required.support-prompt',
|
||||||
|
defaultMessage: 'Having trouble signing in? <support>Get support</support>',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
defineExpose({ show, showSigningIn })
|
||||||
|
</script>
|
||||||
@@ -2,17 +2,18 @@
|
|||||||
<ContentDiffModal
|
<ContentDiffModal
|
||||||
ref="diffModal"
|
ref="diffModal"
|
||||||
:header="formatMessage(messages.updateToPlay)"
|
:header="formatMessage(messages.updateToPlay)"
|
||||||
:admonition-header="formatMessage(messages.updateRequired)"
|
|
||||||
:description="
|
:description="
|
||||||
instance ? formatMessage(messages.updateRequiredDescription, { name: instance.name }) : ''
|
instance ? formatMessage(messages.updateRequiredDescription, { name: instance.name }) : ''
|
||||||
"
|
"
|
||||||
:diffs="normalizedDiffs"
|
:diffs="normalizedDiffs"
|
||||||
|
:version-date="versionDate"
|
||||||
|
:show-external-warnings="showExternalWarnings"
|
||||||
|
:external-warning-description="formatMessage(messages.externalWarningDescription)"
|
||||||
:confirm-label="formatMessage(commonMessages.updateButton)"
|
:confirm-label="formatMessage(commonMessages.updateButton)"
|
||||||
:confirm-icon="DownloadIcon"
|
:confirm-icon="DownloadIcon"
|
||||||
:show-report-button="true"
|
:removed-label="formatMessage(messages.removed)"
|
||||||
@confirm="handleUpdate"
|
@confirm="handleUpdate"
|
||||||
@cancel="handleDecline"
|
@cancel="handleDecline"
|
||||||
@report="handleReport"
|
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -26,9 +27,8 @@ import {
|
|||||||
defineMessages,
|
defineMessages,
|
||||||
useVIntl,
|
useVIntl,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
import { computed, ref, watch } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
import { get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
|
import { get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
|
||||||
import { wait_for_install_job } from '@/helpers/install'
|
import { wait_for_install_job } from '@/helpers/install'
|
||||||
@@ -77,6 +77,15 @@ const { formatMessage } = useVIntl()
|
|||||||
const { startInstallingServer, stopInstallingServer } = injectServerInstall()
|
const { startInstallingServer, stopInstallingServer } = injectServerInstall()
|
||||||
type UpdateCompleteCallback = () => void | Promise<void>
|
type UpdateCompleteCallback = () => void | Promise<void>
|
||||||
|
|
||||||
|
const { showExternalWarnings } = defineProps<{
|
||||||
|
showExternalWarnings?: boolean
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
cancel: []
|
||||||
|
complete: []
|
||||||
|
}>()
|
||||||
|
|
||||||
const diffModal = ref<InstanceType<typeof ContentDiffModal>>()
|
const diffModal = ref<InstanceType<typeof ContentDiffModal>>()
|
||||||
const instance = ref<GameInstance | null>(null)
|
const instance = ref<GameInstance | null>(null)
|
||||||
const onUpdateComplete = ref<UpdateCompleteCallback>(() => {})
|
const onUpdateComplete = ref<UpdateCompleteCallback>(() => {})
|
||||||
@@ -84,14 +93,21 @@ const diffs = ref<DependencyDiff[]>([])
|
|||||||
const modpackVersionId = ref<string | null>(null)
|
const modpackVersionId = ref<string | null>(null)
|
||||||
const modpackVersion = ref<Version | null>(null)
|
const modpackVersion = ref<Version | null>(null)
|
||||||
|
|
||||||
const normalizedDiffs = computed<ContentDiffItem[]>(() =>
|
const normalizedDiffs = computed<ContentDiffItem[]>(() => {
|
||||||
diffs.value.map((diff) => ({
|
return diffs.value.map((diff) => ({
|
||||||
type: diff.type,
|
type: diff.type,
|
||||||
|
external: Boolean(diff.fileName && !diff.project),
|
||||||
projectName: diff.project?.title,
|
projectName: diff.project?.title,
|
||||||
fileName: diff.fileName,
|
fileName: diff.fileName,
|
||||||
currentVersionName: diff.currentVersion?.version_number,
|
currentVersionName: diff.currentVersion?.version_number,
|
||||||
newVersionName: diff.newVersion?.version_number,
|
newVersionName: diff.newVersion?.version_number,
|
||||||
})),
|
}))
|
||||||
|
})
|
||||||
|
|
||||||
|
const versionDate = computed(() =>
|
||||||
|
modpackVersion.value?.date_published
|
||||||
|
? dayjs(modpackVersion.value.date_published).format('MMMM D, YYYY')
|
||||||
|
: undefined,
|
||||||
)
|
)
|
||||||
|
|
||||||
async function computeDependencyDiffs(
|
async function computeDependencyDiffs(
|
||||||
@@ -190,6 +206,10 @@ async function computeDependencyDiffs(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
|
const aExternal = Boolean(a.fileName && !a.project)
|
||||||
|
const bExternal = Boolean(b.fileName && !b.project)
|
||||||
|
if (aExternal !== bExternal) return aExternal ? -1 : 1
|
||||||
|
|
||||||
const typeOrder = { added: 0, updated: 1, removed: 2 }
|
const typeOrder = { added: 0, updated: 1, removed: 2 }
|
||||||
const typeCompare = typeOrder[a.type] - typeOrder[b.type]
|
const typeCompare = typeOrder[a.type] - typeOrder[b.type]
|
||||||
if (typeCompare !== 0) return typeCompare
|
if (typeCompare !== 0) return typeCompare
|
||||||
@@ -227,18 +247,7 @@ async function checkUpdateAvailable(inst: GameInstance): Promise<DependencyDiff[
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(
|
|
||||||
() => instance.value,
|
|
||||||
async (newInstance) => {
|
|
||||||
if (!newInstance) return
|
|
||||||
const result = await checkUpdateAvailable(newInstance)
|
|
||||||
diffs.value = result || []
|
|
||||||
},
|
|
||||||
{ immediate: true, deep: true },
|
|
||||||
)
|
|
||||||
|
|
||||||
async function handleUpdate() {
|
async function handleUpdate() {
|
||||||
hide()
|
|
||||||
const serverProjectId = instance.value?.link?.project_id
|
const serverProjectId = instance.value?.link?.project_id
|
||||||
if (serverProjectId) startInstallingServer(serverProjectId)
|
if (serverProjectId) startInstallingServer(serverProjectId)
|
||||||
try {
|
try {
|
||||||
@@ -251,17 +260,12 @@ async function handleUpdate() {
|
|||||||
console.error('Error updating instance:', error)
|
console.error('Error updating instance:', error)
|
||||||
} finally {
|
} finally {
|
||||||
if (serverProjectId) stopInstallingServer(serverProjectId)
|
if (serverProjectId) stopInstallingServer(serverProjectId)
|
||||||
}
|
emit('complete')
|
||||||
}
|
|
||||||
|
|
||||||
function handleReport() {
|
|
||||||
if (instance.value?.link?.project_id) {
|
|
||||||
openUrl(`https://modrinth.com/report?item=project&itemID=${instance.value.link.project_id}`)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleDecline() {
|
function handleDecline() {
|
||||||
hide()
|
emit('cancel')
|
||||||
}
|
}
|
||||||
|
|
||||||
function show(
|
function show(
|
||||||
@@ -272,8 +276,15 @@ function show(
|
|||||||
) {
|
) {
|
||||||
instance.value = instanceVal
|
instance.value = instanceVal
|
||||||
modpackVersionId.value = modpackVersionIdVal
|
modpackVersionId.value = modpackVersionIdVal
|
||||||
|
modpackVersion.value = null
|
||||||
|
diffs.value = []
|
||||||
onUpdateComplete.value = callback
|
onUpdateComplete.value = callback
|
||||||
diffModal.value?.show(e)
|
diffModal.value?.show(e)
|
||||||
|
void checkUpdateAvailable(instanceVal).then((result) => {
|
||||||
|
if (instance.value?.id === instanceVal.id && modpackVersionId.value === modpackVersionIdVal) {
|
||||||
|
diffs.value = result || []
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function hide() {
|
function hide() {
|
||||||
@@ -285,14 +296,19 @@ const messages = defineMessages({
|
|||||||
id: 'app.modal.update-to-play.header',
|
id: 'app.modal.update-to-play.header',
|
||||||
defaultMessage: 'Update to play',
|
defaultMessage: 'Update to play',
|
||||||
},
|
},
|
||||||
updateRequired: {
|
|
||||||
id: 'app.modal.update-to-play.update-required',
|
|
||||||
defaultMessage: 'Update required',
|
|
||||||
},
|
|
||||||
updateRequiredDescription: {
|
updateRequiredDescription: {
|
||||||
id: 'app.modal.update-to-play.update-required-description',
|
id: 'app.modal.update-to-play.update-required-description',
|
||||||
defaultMessage:
|
defaultMessage:
|
||||||
'An update is required to play {name}. Please update to the latest version to launch the game.',
|
'An update is required to play {name}. Please update to latest version to launch the game.',
|
||||||
|
},
|
||||||
|
removed: {
|
||||||
|
id: 'app.modal.update-to-play.removed',
|
||||||
|
defaultMessage: 'Removed',
|
||||||
|
},
|
||||||
|
externalWarningDescription: {
|
||||||
|
id: 'app.modal.update-to-play.server-modpack-unknown-files-description',
|
||||||
|
defaultMessage:
|
||||||
|
'This server modpack update contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust.',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,44 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { Toggle } from '@modrinth/ui'
|
import { Settings2Icon } from '@modrinth/assets'
|
||||||
|
import {
|
||||||
|
ButtonStyled,
|
||||||
|
defineMessages,
|
||||||
|
injectNotificationManager,
|
||||||
|
injectPageContext,
|
||||||
|
Toggle,
|
||||||
|
useVIntl,
|
||||||
|
} from '@modrinth/ui'
|
||||||
import { ref, watch } from 'vue'
|
import { ref, watch } from 'vue'
|
||||||
|
|
||||||
|
import { open_ads_consent_preferences } from '@/helpers/ads.js'
|
||||||
import { optInAnalytics, optOutAnalytics } from '@/helpers/analytics'
|
import { optInAnalytics, optOutAnalytics } from '@/helpers/analytics'
|
||||||
import { get, set } from '@/helpers/settings.ts'
|
import { get, set } from '@/helpers/settings.ts'
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const { handleError } = injectNotificationManager()
|
||||||
|
const { adConsentAvailable } = injectPageContext()
|
||||||
const settings = ref(await get())
|
const settings = ref(await get())
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
adsConsentTitle: {
|
||||||
|
id: 'app.ads-consent.title',
|
||||||
|
defaultMessage: 'Your privacy and how ads support Modrinth',
|
||||||
|
},
|
||||||
|
adsConsentIntro: {
|
||||||
|
id: 'app.settings.privacy.ads-consent.intro',
|
||||||
|
defaultMessage:
|
||||||
|
'Ads make Modrinth possible and fund creator payouts. Our partners may store or access cookies in the app to personalize ads and measure performance. You can opt out or manage your preferences below.',
|
||||||
|
},
|
||||||
|
adsConsentManage: {
|
||||||
|
id: 'app.ads-consent.manage',
|
||||||
|
defaultMessage: 'Manage preferences',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
async function manageAdsPreferences() {
|
||||||
|
await open_ads_consent_preferences().catch(handleError)
|
||||||
|
}
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
settings,
|
settings,
|
||||||
async () => {
|
async () => {
|
||||||
@@ -23,18 +55,26 @@ watch(
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="flex items-center justify-between gap-4">
|
<div v-if="adConsentAvailable">
|
||||||
<div>
|
<h2 class="m-0 text-lg font-semibold text-contrast">
|
||||||
<h2 class="m-0 text-lg font-semibold text-contrast">Personalized ads</h2>
|
{{ formatMessage(messages.adsConsentTitle) }}
|
||||||
<p class="m-0 mt-1 text-sm">
|
</h2>
|
||||||
Modrinth's ad provider, Aditude, shows ads based on your preferences. By disabling this
|
<div class="mt-1 flex flex-col gap-2.5 items-start">
|
||||||
option, you opt out and ads will no longer be shown based on your interests.
|
<div class="flex flex-col gap-1 items-start">
|
||||||
</p>
|
<div class="text-sm">
|
||||||
|
{{ formatMessage(messages.adsConsentIntro) }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ButtonStyled>
|
||||||
|
<button class="!shadow-none" @click="manageAdsPreferences">
|
||||||
|
<Settings2Icon aria-hidden="true" />
|
||||||
|
{{ formatMessage(messages.adsConsentManage) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
</div>
|
</div>
|
||||||
<Toggle id="personalized-ads" v-model="settings.personalized_ads" />
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mt-4 flex items-center justify-between gap-4">
|
<div class="mt-8 flex items-center justify-between gap-4">
|
||||||
<div>
|
<div>
|
||||||
<h2 class="m-0 text-lg font-semibold text-contrast">Telemetry</h2>
|
<h2 class="m-0 text-lg font-semibold text-contrast">Telemetry</h2>
|
||||||
<p class="m-0 mt-1 text-sm">
|
<p class="m-0 mt-1 text-sm">
|
||||||
|
|||||||
+100
@@ -0,0 +1,100 @@
|
|||||||
|
<template>
|
||||||
|
<NewModal ref="modal" :header="formatMessage(messages.header)" fade="warning" max-width="500px">
|
||||||
|
<p class="m-0 text-secondary">
|
||||||
|
<IntlFormatted :message-id="messages.body" :values="{ instanceName }">
|
||||||
|
<template #bold="{ children }">
|
||||||
|
<span class="font-medium text-contrast"><component :is="() => children" /></span>
|
||||||
|
</template>
|
||||||
|
</IntlFormatted>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<template #actions>
|
||||||
|
<div class="flex justify-end gap-2">
|
||||||
|
<ButtonStyled type="outlined">
|
||||||
|
<button @click="handleCancel">
|
||||||
|
<XIcon />
|
||||||
|
{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled>
|
||||||
|
<button @click="handleGoToInstance">
|
||||||
|
{{ formatMessage(messages.instance) }}
|
||||||
|
<RightArrowIcon />
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="orange">
|
||||||
|
<button @click="handleInstallAnyway">
|
||||||
|
<DownloadIcon />
|
||||||
|
{{ formatMessage(messages.installAnyway) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</NewModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { DownloadIcon, RightArrowIcon, XIcon } from '@modrinth/assets'
|
||||||
|
import {
|
||||||
|
ButtonStyled,
|
||||||
|
commonMessages,
|
||||||
|
defineMessages,
|
||||||
|
IntlFormatted,
|
||||||
|
NewModal,
|
||||||
|
useVIntl,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
header: {
|
||||||
|
id: 'app.instance.shared-instance-already-installed.header',
|
||||||
|
defaultMessage: 'Shared instance already installed',
|
||||||
|
},
|
||||||
|
body: {
|
||||||
|
id: 'app.instance.shared-instance-already-installed.body',
|
||||||
|
defaultMessage:
|
||||||
|
'This shared instance is already installed as <bold>{instanceName}</bold>. Are you sure you want to install another copy?',
|
||||||
|
},
|
||||||
|
instance: {
|
||||||
|
id: 'app.instance.shared-instance-already-installed.instance',
|
||||||
|
defaultMessage: 'Instance',
|
||||||
|
},
|
||||||
|
installAnyway: {
|
||||||
|
id: 'app.instance.shared-instance-already-installed.install-anyway',
|
||||||
|
defaultMessage: 'Install anyway',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
(e: 'cancel' | 'go-to-instance' | 'install-anyway'): void
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const modal = ref<InstanceType<typeof NewModal>>()
|
||||||
|
const instanceName = ref('')
|
||||||
|
|
||||||
|
function show(name: string) {
|
||||||
|
instanceName.value = name
|
||||||
|
modal.value?.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleCancel() {
|
||||||
|
modal.value?.hide()
|
||||||
|
emit('cancel')
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleGoToInstance() {
|
||||||
|
modal.value?.hide()
|
||||||
|
emit('go-to-instance')
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleInstallAnyway() {
|
||||||
|
modal.value?.hide()
|
||||||
|
emit('install-anyway')
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
show,
|
||||||
|
})
|
||||||
|
</script>
|
||||||
+195
@@ -0,0 +1,195 @@
|
|||||||
|
<template>
|
||||||
|
<div v-if="canUnpublish" class="flex flex-col gap-2.5">
|
||||||
|
<span class="text-lg font-semibold text-contrast">{{ formatMessage(messages.title) }}</span>
|
||||||
|
<div>
|
||||||
|
<ButtonStyled color="orange">
|
||||||
|
<button :disabled="busy" @click="unpublishModal?.show()">
|
||||||
|
<SpinnerIcon v-if="unpublishing" class="animate-spin" />
|
||||||
|
<UnlinkIcon v-else class="size-5" />
|
||||||
|
{{ formatMessage(unpublishing ? messages.unpublishingButton : messages.unpublishButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
<span class="text-primary">{{ formatMessage(messages.unpublishDescription) }}</span>
|
||||||
|
</div>
|
||||||
|
<div v-if="canUnlink" class="flex flex-col gap-2.5">
|
||||||
|
<span class="text-lg font-semibold text-contrast">{{
|
||||||
|
formatMessage(messages.linkedTitle)
|
||||||
|
}}</span>
|
||||||
|
<div>
|
||||||
|
<ButtonStyled color="orange">
|
||||||
|
<button :disabled="busy" @click="unlinkModal?.show()">
|
||||||
|
<SpinnerIcon v-if="unlinking" class="animate-spin" />
|
||||||
|
<UnlinkIcon v-else class="size-5" />
|
||||||
|
{{ formatMessage(unlinking ? messages.unlinkingButton : messages.unlinkButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
<span class="text-primary">{{ formatMessage(messages.unlinkDescription) }}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<NewModal
|
||||||
|
ref="unpublishModal"
|
||||||
|
:header="formatMessage(messages.unpublishModalHeader)"
|
||||||
|
fade="warning"
|
||||||
|
max-width="500px"
|
||||||
|
>
|
||||||
|
<Admonition type="warning" :header="formatMessage(messages.unpublishModalAdmonitionHeader)">{{
|
||||||
|
formatMessage(messages.unpublishModalBody)
|
||||||
|
}}</Admonition>
|
||||||
|
<template #actions
|
||||||
|
><div class="flex justify-end gap-2">
|
||||||
|
<ButtonStyled type="outlined"
|
||||||
|
><button class="!border" @click="unpublishModal?.hide()">
|
||||||
|
<XIcon />{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</button></ButtonStyled
|
||||||
|
><ButtonStyled color="orange"
|
||||||
|
><button :disabled="busy" @click="confirmUnpublish">
|
||||||
|
<UnlinkIcon />{{ formatMessage(messages.unpublishButton) }}
|
||||||
|
</button></ButtonStyled
|
||||||
|
>
|
||||||
|
</div></template
|
||||||
|
>
|
||||||
|
</NewModal>
|
||||||
|
<NewModal
|
||||||
|
ref="unlinkModal"
|
||||||
|
:header="formatMessage(messages.unlinkModalHeader)"
|
||||||
|
fade="warning"
|
||||||
|
max-width="500px"
|
||||||
|
:on-hide="() => backupCreator?.cancelBackup()"
|
||||||
|
>
|
||||||
|
<div class="flex flex-col gap-6">
|
||||||
|
<Admonition type="warning" :header="formatMessage(messages.unlinkModalAdmonitionHeader)">{{
|
||||||
|
formatMessage(messages.unlinkModalBody)
|
||||||
|
}}</Admonition>
|
||||||
|
<InlineBackupCreator
|
||||||
|
ref="backupCreator"
|
||||||
|
backup-name="Before unlinking shared instance"
|
||||||
|
@update:buttons-disabled="backupBusy = $event"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<template #actions
|
||||||
|
><div class="flex justify-end gap-2">
|
||||||
|
<ButtonStyled type="outlined"
|
||||||
|
><button class="!border" @click="unlinkModal?.hide()">
|
||||||
|
<XIcon />{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</button></ButtonStyled
|
||||||
|
><ButtonStyled color="orange"
|
||||||
|
><button :disabled="busy || backupBusy" @click="confirmUnlink">
|
||||||
|
<UnlinkIcon />{{ formatMessage(messages.unlinkButton) }}
|
||||||
|
</button></ButtonStyled
|
||||||
|
>
|
||||||
|
</div></template
|
||||||
|
>
|
||||||
|
</NewModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { SpinnerIcon, UnlinkIcon, XIcon } from '@modrinth/assets'
|
||||||
|
import {
|
||||||
|
Admonition,
|
||||||
|
ButtonStyled,
|
||||||
|
commonMessages,
|
||||||
|
defineMessages,
|
||||||
|
InlineBackupCreator,
|
||||||
|
NewModal,
|
||||||
|
useVIntl,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
import { ref } from 'vue'
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
canUnpublish?: boolean
|
||||||
|
canUnlink?: boolean
|
||||||
|
busy: boolean
|
||||||
|
unpublishing?: boolean
|
||||||
|
unlinking?: boolean
|
||||||
|
unpublish?: () => Promise<void>
|
||||||
|
unlink?: () => Promise<void>
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
canUnpublish: false,
|
||||||
|
canUnlink: false,
|
||||||
|
unpublishing: false,
|
||||||
|
unlinking: false,
|
||||||
|
unpublish: undefined,
|
||||||
|
unlink: undefined,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const unpublishModal = ref<InstanceType<typeof NewModal>>()
|
||||||
|
const unlinkModal = ref<InstanceType<typeof NewModal>>()
|
||||||
|
const backupCreator = ref<InstanceType<typeof InlineBackupCreator>>()
|
||||||
|
const backupBusy = ref(false)
|
||||||
|
|
||||||
|
async function confirmUnpublish() {
|
||||||
|
unpublishModal.value?.hide()
|
||||||
|
await props.unpublish?.()
|
||||||
|
}
|
||||||
|
async function confirmUnlink() {
|
||||||
|
unlinkModal.value?.hide()
|
||||||
|
await props.unlink?.()
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
title: {
|
||||||
|
id: 'installation-settings.shared-instance.title',
|
||||||
|
defaultMessage: 'Unpublish instance',
|
||||||
|
},
|
||||||
|
linkedTitle: {
|
||||||
|
id: 'installation-settings.shared-instance.linked-title',
|
||||||
|
defaultMessage: 'Linked shared instance',
|
||||||
|
},
|
||||||
|
unpublishButton: {
|
||||||
|
id: 'installation-settings.shared-instance.unpublish-button',
|
||||||
|
defaultMessage: 'Unpublish shared instance',
|
||||||
|
},
|
||||||
|
unpublishingButton: {
|
||||||
|
id: 'installation-settings.shared-instance.unpublishing-button',
|
||||||
|
defaultMessage: 'Unpublishing...',
|
||||||
|
},
|
||||||
|
unpublishDescription: {
|
||||||
|
id: 'installation-settings.shared-instance.unpublish-description',
|
||||||
|
defaultMessage:
|
||||||
|
'Remove this shared instance from Modrinth and stop sending updates to anyone using it. Your local instance will not be affected.',
|
||||||
|
},
|
||||||
|
unlinkButton: {
|
||||||
|
id: 'installation-settings.shared-instance.unlink-button',
|
||||||
|
defaultMessage: 'Unlink shared instance',
|
||||||
|
},
|
||||||
|
unlinkingButton: {
|
||||||
|
id: 'installation-settings.shared-instance.unlinking-button',
|
||||||
|
defaultMessage: 'Unlinking...',
|
||||||
|
},
|
||||||
|
unlinkDescription: {
|
||||||
|
id: 'installation-settings.shared-instance.unlink-description',
|
||||||
|
defaultMessage: 'Disconnect this local instance from future shared updates.',
|
||||||
|
},
|
||||||
|
unpublishModalHeader: {
|
||||||
|
id: 'installation-settings.unpublish-shared-instance.modal.header',
|
||||||
|
defaultMessage: 'Unpublish shared instance',
|
||||||
|
},
|
||||||
|
unpublishModalAdmonitionHeader: {
|
||||||
|
id: 'installation-settings.unpublish-shared-instance.modal.admonition-header',
|
||||||
|
defaultMessage: 'Unpublishing shared instance',
|
||||||
|
},
|
||||||
|
unpublishModalBody: {
|
||||||
|
id: 'installation-settings.unpublish-shared-instance.modal.admonition-body',
|
||||||
|
defaultMessage:
|
||||||
|
"This deletes the shared instance from Modrinth's servers. People using it in the Modrinth App will stop receiving updates, but your local instance and its content will stay on this device.",
|
||||||
|
},
|
||||||
|
unlinkModalHeader: {
|
||||||
|
id: 'installation-settings.unlink-shared-instance.modal.header',
|
||||||
|
defaultMessage: 'Unlink shared instance',
|
||||||
|
},
|
||||||
|
unlinkModalAdmonitionHeader: {
|
||||||
|
id: 'installation-settings.unlink-shared-instance.modal.admonition-header',
|
||||||
|
defaultMessage: 'Unlinking shared instance',
|
||||||
|
},
|
||||||
|
unlinkModalBody: {
|
||||||
|
id: 'installation-settings.unlink-shared-instance.modal.admonition-body',
|
||||||
|
defaultMessage:
|
||||||
|
'This only affects your local instance. Your installed content will stay on this device, and the shared instance and other people using it will not be affected.',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,189 @@
|
|||||||
|
<template>
|
||||||
|
<ContentDiffModal
|
||||||
|
ref="publishReviewModal"
|
||||||
|
:header="formatMessage(messages.header)"
|
||||||
|
:admonition-header="formatMessage(messages.admonitionHeader)"
|
||||||
|
:description="formatMessage(messages.description)"
|
||||||
|
:diffs="publishDiffs"
|
||||||
|
:confirm-label="formatMessage(messages.publishButton)"
|
||||||
|
:confirm-icon="UploadIcon"
|
||||||
|
:confirm-disabled="publishDiffs.length === 0 && selectedConfigPaths.length === 0"
|
||||||
|
:added-label="formatMessage(messages.addedLabel)"
|
||||||
|
:removed-label="formatMessage(messages.removedLabel)"
|
||||||
|
@confirm="publishChanges"
|
||||||
|
@cancel="finishReview"
|
||||||
|
>
|
||||||
|
<template #additional-content>
|
||||||
|
<Accordion
|
||||||
|
class="min-w-0"
|
||||||
|
overflow-visible
|
||||||
|
button-class="w-full bg-transparent m-0 p-0 border-none"
|
||||||
|
>
|
||||||
|
<template #title>
|
||||||
|
<FileCogIcon class="size-4 shrink-0 text-primary" />
|
||||||
|
<span class="text-lg font-semibold text-contrast">
|
||||||
|
{{ formatMessage(messages.configTitle) }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
<div class="flex min-w-0 flex-col gap-3 pt-4">
|
||||||
|
<div class="max-h-[292px] overflow-y-auto rounded-[20px]">
|
||||||
|
<FileTreeSelect
|
||||||
|
v-model="selectedConfigPaths"
|
||||||
|
:items="configFileItems"
|
||||||
|
:show-size="false"
|
||||||
|
:show-modified="false"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Accordion>
|
||||||
|
</template>
|
||||||
|
</ContentDiffModal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { FileCogIcon, UploadIcon } from '@modrinth/assets'
|
||||||
|
import {
|
||||||
|
Accordion,
|
||||||
|
type ContentDiffItem,
|
||||||
|
ContentDiffModal,
|
||||||
|
defineMessages,
|
||||||
|
FileTreeSelect,
|
||||||
|
type FileTreeSelectItem,
|
||||||
|
useVIntl,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
|
import {
|
||||||
|
getSharedInstanceUnavailableReason,
|
||||||
|
isSharedInstanceUnavailableError,
|
||||||
|
} from '@/helpers/install'
|
||||||
|
import { get_shared_instance_publish_preview, publish_shared_instance } from '@/helpers/instance'
|
||||||
|
import { useSharedInstanceErrors } from '@/helpers/shared-instance-errors'
|
||||||
|
import type { GameInstance } from '@/helpers/types'
|
||||||
|
|
||||||
|
type SharedInstancePublishState = 'idle' | 'reviewing' | 'publishing'
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
instance: GameInstance
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
published: []
|
||||||
|
'state-change': [state: SharedInstancePublishState]
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const { notifySharedInstanceError, notifySharedInstanceUnavailable } = useSharedInstanceErrors()
|
||||||
|
const publishReviewModal = ref<InstanceType<typeof ContentDiffModal>>()
|
||||||
|
const publishDiffs = ref<ContentDiffItem[]>([])
|
||||||
|
const configFilePaths = ref<string[]>([])
|
||||||
|
const selectedConfigPaths = ref<string[]>([])
|
||||||
|
const state = ref<SharedInstancePublishState>('idle')
|
||||||
|
const configFileItems = computed<FileTreeSelectItem[]>(() =>
|
||||||
|
configFilePaths.value.map((path) => ({ path, type: 'file' })),
|
||||||
|
)
|
||||||
|
|
||||||
|
async function show(e?: MouseEvent) {
|
||||||
|
if (state.value !== 'idle') return
|
||||||
|
|
||||||
|
setState('reviewing')
|
||||||
|
let reviewOpened = false
|
||||||
|
try {
|
||||||
|
const preview = await get_shared_instance_publish_preview(props.instance.id)
|
||||||
|
if (!preview) {
|
||||||
|
notifySharedInstanceUnavailable()
|
||||||
|
emit('published')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
publishDiffs.value = preview.diffs.map((diff) => ({
|
||||||
|
type: diff.type,
|
||||||
|
projectName: diff.projectName ?? undefined,
|
||||||
|
fileName: diff.fileName ?? undefined,
|
||||||
|
currentVersionName: diff.currentVersionName ?? undefined,
|
||||||
|
newVersionName: diff.newVersionName ?? undefined,
|
||||||
|
fileCount: diff.configFileCount ?? undefined,
|
||||||
|
disabled: diff.disabled,
|
||||||
|
}))
|
||||||
|
configFilePaths.value = preview.configFiles
|
||||||
|
selectedConfigPaths.value = []
|
||||||
|
if (!publishReviewModal.value) return
|
||||||
|
|
||||||
|
publishReviewModal.value.show(e)
|
||||||
|
reviewOpened = true
|
||||||
|
} catch (error) {
|
||||||
|
handlePublishError(error)
|
||||||
|
} finally {
|
||||||
|
if (!reviewOpened) finishReview()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function publishChanges() {
|
||||||
|
if (state.value !== 'reviewing') return
|
||||||
|
|
||||||
|
setState('publishing')
|
||||||
|
try {
|
||||||
|
await publish_shared_instance(props.instance.id, selectedConfigPaths.value)
|
||||||
|
emit('published')
|
||||||
|
} catch (error) {
|
||||||
|
handlePublishError(error)
|
||||||
|
} finally {
|
||||||
|
setState('idle')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function finishReview() {
|
||||||
|
if (state.value === 'reviewing') {
|
||||||
|
setState('idle')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handlePublishError(error: unknown) {
|
||||||
|
if (isSharedInstanceUnavailableError(error)) {
|
||||||
|
notifySharedInstanceUnavailable(getSharedInstanceUnavailableReason(error))
|
||||||
|
emit('published')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
notifySharedInstanceError(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
function setState(nextState: SharedInstancePublishState) {
|
||||||
|
state.value = nextState
|
||||||
|
emit('state-change', nextState)
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
header: {
|
||||||
|
id: 'instance.shared-instance.publish-review.header',
|
||||||
|
defaultMessage: 'Review changes',
|
||||||
|
},
|
||||||
|
admonitionHeader: {
|
||||||
|
id: 'instance.shared-instance.publish-review.admonition-header',
|
||||||
|
defaultMessage: 'Push update to players',
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
id: 'instance.shared-instance.publish-review.description',
|
||||||
|
defaultMessage:
|
||||||
|
'Review the content changes and choose any config files to include in this update.',
|
||||||
|
},
|
||||||
|
publishButton: {
|
||||||
|
id: 'instance.shared-instance.publish-review.publish-button',
|
||||||
|
defaultMessage: 'Push update',
|
||||||
|
},
|
||||||
|
addedLabel: {
|
||||||
|
id: 'instance.shared-instance.publish-review.added-label',
|
||||||
|
defaultMessage: 'Added',
|
||||||
|
},
|
||||||
|
removedLabel: {
|
||||||
|
id: 'instance.shared-instance.publish-review.removed-label',
|
||||||
|
defaultMessage: 'Removed',
|
||||||
|
},
|
||||||
|
configTitle: {
|
||||||
|
id: 'instance.shared-instance.publish-review.config-title-v2',
|
||||||
|
defaultMessage: 'Select config files',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
defineExpose({ show })
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
<template>
|
||||||
|
<ContentDiffModal
|
||||||
|
ref="modal"
|
||||||
|
:header="formatMessage(messages.updateToPlay)"
|
||||||
|
:admonition-header="formatMessage(messages.updateRequired)"
|
||||||
|
:description="instance ? formatMessage(messages.description, { name: instance.name }) : ''"
|
||||||
|
:diffs="diffs"
|
||||||
|
:confirm-label="formatMessage(commonMessages.updateButton)"
|
||||||
|
:confirm-icon="DownloadIcon"
|
||||||
|
:added-label="formatMessage(messages.addedLabel)"
|
||||||
|
:removed-label="formatMessage(messages.removedLabel)"
|
||||||
|
show-report-button
|
||||||
|
show-external-warnings
|
||||||
|
:external-warning-description="formatMessage(messages.externalWarningDescription)"
|
||||||
|
@confirm="update"
|
||||||
|
@cancel="emit('cancel')"
|
||||||
|
@report="emit('report', $event)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { DownloadIcon } from '@modrinth/assets'
|
||||||
|
import {
|
||||||
|
commonMessages,
|
||||||
|
type ContentDiffItem,
|
||||||
|
ContentDiffModal,
|
||||||
|
defineMessages,
|
||||||
|
useVIntl,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
import { computed, ref } from 'vue'
|
||||||
|
|
||||||
|
import {
|
||||||
|
getSharedInstanceUnavailableReason,
|
||||||
|
install_update_shared_instance,
|
||||||
|
isSharedInstanceUnavailableError,
|
||||||
|
type SharedInstanceUnavailableReason,
|
||||||
|
type SharedInstanceUpdatePreview,
|
||||||
|
wait_for_install_job,
|
||||||
|
} from '@/helpers/install'
|
||||||
|
import { useSharedInstanceErrors } from '@/helpers/shared-instance-errors'
|
||||||
|
import type { GameInstance } from '@/helpers/types'
|
||||||
|
|
||||||
|
type UpdateCompleteCallback = () => void | Promise<void>
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
cancel: []
|
||||||
|
complete: []
|
||||||
|
report: [event?: MouseEvent]
|
||||||
|
sharedInstanceUnavailable: [reason: SharedInstanceUnavailableReason | null]
|
||||||
|
}>()
|
||||||
|
const modal = ref<InstanceType<typeof ContentDiffModal>>()
|
||||||
|
const instance = ref<GameInstance | null>(null)
|
||||||
|
const preview = ref<SharedInstanceUpdatePreview | null>(null)
|
||||||
|
const onComplete = ref<UpdateCompleteCallback>(() => {})
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const { notifySharedInstanceError } = useSharedInstanceErrors()
|
||||||
|
const diffs = computed<ContentDiffItem[]>(
|
||||||
|
() =>
|
||||||
|
preview.value?.diffs
|
||||||
|
// TODO: This is TEMP!!! Hashing needs to be done on backend
|
||||||
|
.filter((diff) => !(diff.type === 'updated' && !diff.projectId && diff.fileName))
|
||||||
|
.map((diff) => ({
|
||||||
|
type: diff.type,
|
||||||
|
projectName: diff.projectName ?? undefined,
|
||||||
|
fileName: diff.fileName ?? undefined,
|
||||||
|
currentVersionName: diff.currentVersionName ?? undefined,
|
||||||
|
newVersionName: diff.newVersionName ?? undefined,
|
||||||
|
fileCount: diff.configFileCount ?? undefined,
|
||||||
|
disabled: diff.disabled,
|
||||||
|
external: diff.type === 'added' && !diff.projectId && !!diff.fileName,
|
||||||
|
})) ?? [],
|
||||||
|
)
|
||||||
|
|
||||||
|
async function update() {
|
||||||
|
try {
|
||||||
|
if (instance.value) {
|
||||||
|
const job = await install_update_shared_instance(instance.value.id)
|
||||||
|
await wait_for_install_job(job.job_id)
|
||||||
|
await onComplete.value()
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (isSharedInstanceUnavailableError(error)) {
|
||||||
|
emit('sharedInstanceUnavailable', getSharedInstanceUnavailableReason(error))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
notifySharedInstanceError(error)
|
||||||
|
} finally {
|
||||||
|
emit('complete')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function show(
|
||||||
|
instanceValue: GameInstance,
|
||||||
|
previewValue: SharedInstanceUpdatePreview,
|
||||||
|
callback: UpdateCompleteCallback = () => {},
|
||||||
|
event?: MouseEvent,
|
||||||
|
) {
|
||||||
|
instance.value = instanceValue
|
||||||
|
preview.value = previewValue
|
||||||
|
onComplete.value = callback
|
||||||
|
modal.value?.show(event)
|
||||||
|
}
|
||||||
|
function hide() {
|
||||||
|
modal.value?.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
updateToPlay: { id: 'app.modal.update-to-play.header', defaultMessage: 'Update to play' },
|
||||||
|
updateRequired: {
|
||||||
|
id: 'app.modal.update-to-play.update-required',
|
||||||
|
defaultMessage: 'Update required',
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
id: 'app.modal.update-to-play.update-required-description',
|
||||||
|
defaultMessage:
|
||||||
|
'An update is required to play {name}. Please update to latest version to launch the game.',
|
||||||
|
},
|
||||||
|
addedLabel: {
|
||||||
|
id: 'app.modal.update-to-play.shared-instance-added-label',
|
||||||
|
defaultMessage: 'Added',
|
||||||
|
},
|
||||||
|
removedLabel: {
|
||||||
|
id: 'app.modal.update-to-play.shared-instance-removed-label',
|
||||||
|
defaultMessage: 'Removed',
|
||||||
|
},
|
||||||
|
externalWarningDescription: {
|
||||||
|
id: 'app.modal.update-to-play.shared-instance-unknown-files-description',
|
||||||
|
defaultMessage:
|
||||||
|
'This shared instance update contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust.',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
defineExpose({ show, hide })
|
||||||
|
</script>
|
||||||
+533
@@ -0,0 +1,533 @@
|
|||||||
|
<template>
|
||||||
|
<NewModal
|
||||||
|
ref="modal"
|
||||||
|
:header="
|
||||||
|
reportMode
|
||||||
|
? formatMessage(messages.reportSharedInstance)
|
||||||
|
: formatMessage(messages.installToPlay)
|
||||||
|
"
|
||||||
|
:closable="!submitLoading"
|
||||||
|
:on-hide="handleHide"
|
||||||
|
:max-width="reportMode ? '816px' : '544px'"
|
||||||
|
:width="reportMode ? '816px' : '544px'"
|
||||||
|
:no-padding="reportMode"
|
||||||
|
:scrollable="reportMode"
|
||||||
|
>
|
||||||
|
<div v-if="preview" class="flex w-full flex-col gap-6" :class="{ 'p-6 pb-2': reportMode }">
|
||||||
|
<Admonition v-if="reportMode" type="info">
|
||||||
|
<div class="flex flex-col gap-2">
|
||||||
|
<p class="m-0">
|
||||||
|
<IntlFormatted :message-id="messages.reportDescription">
|
||||||
|
<template #rules-link="{ children }">
|
||||||
|
<AutoLink class="text-link hover:underline" to="https://modrinth.com/legal/rules">
|
||||||
|
<component :is="() => children" />
|
||||||
|
</AutoLink>
|
||||||
|
</template>
|
||||||
|
<template #terms-link="{ children }">
|
||||||
|
<AutoLink class="text-link hover:underline" to="https://modrinth.com/legal/terms">
|
||||||
|
<component :is="() => children" />
|
||||||
|
</AutoLink>
|
||||||
|
</template>
|
||||||
|
</IntlFormatted>
|
||||||
|
</p>
|
||||||
|
<ul class="m-0 list-disc pl-5">
|
||||||
|
<li>
|
||||||
|
<IntlFormatted :message-id="messages.supportAndBugReports">
|
||||||
|
<template #support-link="{ children }">
|
||||||
|
<AutoLink class="text-link hover:underline" to="https://support.modrinth.com">
|
||||||
|
<component :is="() => children" />
|
||||||
|
</AutoLink>
|
||||||
|
</template>
|
||||||
|
<template #github-link="{ children }">
|
||||||
|
<AutoLink
|
||||||
|
class="text-link hover:underline"
|
||||||
|
to="https://github.com/modrinth/code/issues"
|
||||||
|
>
|
||||||
|
<component :is="() => children" />
|
||||||
|
</AutoLink>
|
||||||
|
</template>
|
||||||
|
</IntlFormatted>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<IntlFormatted :message-id="messages.legalClaims">
|
||||||
|
<template #copyright-link="{ children }">
|
||||||
|
<AutoLink
|
||||||
|
class="text-link hover:underline"
|
||||||
|
to="https://modrinth.com/legal/copyright"
|
||||||
|
>
|
||||||
|
<component :is="() => children" />
|
||||||
|
</AutoLink>
|
||||||
|
</template>
|
||||||
|
</IntlFormatted>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</Admonition>
|
||||||
|
<p v-else class="m-0 text-primary">
|
||||||
|
{{ formatMessage(messages.inviteWarning) }}
|
||||||
|
</p>
|
||||||
|
<SharedInstanceInstallSummary
|
||||||
|
:preview="preview"
|
||||||
|
:heading="reportMode ? formatMessage(messages.contentYouAreReporting) : undefined"
|
||||||
|
@view-contents="openViewContents"
|
||||||
|
/>
|
||||||
|
<Transition
|
||||||
|
enter-active-class="overflow-hidden transition-all duration-200 ease-out"
|
||||||
|
enter-from-class="max-h-0 opacity-0"
|
||||||
|
enter-to-class="max-h-[400px] opacity-100"
|
||||||
|
leave-active-class="overflow-hidden transition-all duration-200 ease-in"
|
||||||
|
leave-from-class="max-h-[400px] opacity-100"
|
||||||
|
leave-to-class="max-h-0 opacity-0"
|
||||||
|
>
|
||||||
|
<div v-if="reportMode" class="flex flex-col gap-6">
|
||||||
|
<div class="flex flex-col gap-2.5">
|
||||||
|
<span class="font-semibold text-contrast">
|
||||||
|
{{ formatMessage(messages.reportReason) }}
|
||||||
|
</span>
|
||||||
|
<Combobox v-model="reportReason" :options="reportReasonOptions" />
|
||||||
|
</div>
|
||||||
|
<div class="flex flex-col gap-2.5">
|
||||||
|
<span class="font-semibold text-contrast">
|
||||||
|
{{ formatMessage(messages.additionalContext) }}
|
||||||
|
</span>
|
||||||
|
<MarkdownEditor
|
||||||
|
v-model="additionalContext"
|
||||||
|
:placeholder="formatMessage(messages.additionalContextPlaceholder)"
|
||||||
|
:on-image-upload="onImageUpload"
|
||||||
|
:min-height="120"
|
||||||
|
:max-height="240"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div v-if="reportOnly" class="flex flex-col gap-2">
|
||||||
|
<Checkbox v-model="deleteInstance" :label="formatMessage(messages.deleteInstance)" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Transition>
|
||||||
|
<Admonition
|
||||||
|
v-if="!reportMode && hasExternalFiles"
|
||||||
|
type="warning"
|
||||||
|
:header="formatMessage(messages.unknownFilesWarning)"
|
||||||
|
>
|
||||||
|
{{ formatMessage(messages.unknownFilesDescription) }}
|
||||||
|
</Admonition>
|
||||||
|
|
||||||
|
<div v-if="!reportMode && hasExternalFiles" class="relative w-full">
|
||||||
|
<div
|
||||||
|
ref="externalFileTable"
|
||||||
|
class="max-h-[242px] overflow-y-auto rounded-2xl"
|
||||||
|
@scroll="checkTableScrollState"
|
||||||
|
>
|
||||||
|
<Table
|
||||||
|
:columns="externalFileColumns"
|
||||||
|
:data="externalFileRows"
|
||||||
|
row-key="id"
|
||||||
|
virtualized
|
||||||
|
:virtual-row-height="48"
|
||||||
|
class="shadow-sm"
|
||||||
|
>
|
||||||
|
<template #cell-name="{ value }">
|
||||||
|
<span class="block truncate" :title="String(value)">{{ value }}</span>
|
||||||
|
</template>
|
||||||
|
</Table>
|
||||||
|
</div>
|
||||||
|
<Transition
|
||||||
|
enter-active-class="transition-all duration-200 ease-out"
|
||||||
|
enter-from-class="opacity-0 max-h-0"
|
||||||
|
enter-to-class="opacity-100 max-h-2"
|
||||||
|
leave-active-class="transition-all duration-200 ease-in"
|
||||||
|
leave-from-class="opacity-100 max-h-2"
|
||||||
|
leave-to-class="opacity-0 max-h-0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="showTableTopFade"
|
||||||
|
class="pointer-events-none absolute left-0 right-0 top-0 z-10 h-2 bg-gradient-to-b from-bg-raised to-transparent"
|
||||||
|
/>
|
||||||
|
</Transition>
|
||||||
|
<Transition
|
||||||
|
enter-active-class="transition-all duration-200 ease-out"
|
||||||
|
enter-from-class="opacity-0 max-h-0"
|
||||||
|
enter-to-class="opacity-100 max-h-2"
|
||||||
|
leave-active-class="transition-all duration-200 ease-in"
|
||||||
|
leave-from-class="opacity-100 max-h-2"
|
||||||
|
leave-to-class="opacity-0 max-h-0"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-if="showTableBottomFade"
|
||||||
|
class="pointer-events-none absolute bottom-0 left-0 right-0 z-10 h-2 bg-gradient-to-t from-bg-raised to-transparent"
|
||||||
|
/>
|
||||||
|
</Transition>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p v-if="!reportMode && hasExternalFiles" class="m-0 text-primary">
|
||||||
|
{{ formatMessage(messages.reviewedFiles) }}
|
||||||
|
</p>
|
||||||
|
<div v-if="!reportMode" class="flex w-full items-center justify-between gap-2">
|
||||||
|
<ButtonStyled color="red" type="transparent">
|
||||||
|
<button @click="reportMode = true">
|
||||||
|
<ReportIcon />{{ formatMessage(commonMessages.reportButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<div class="flex items-center gap-2">
|
||||||
|
<template v-if="hasExternalFiles">
|
||||||
|
<ButtonStyled type="transparent" color="orange">
|
||||||
|
<button @click="accept">
|
||||||
|
{{ formatMessage(messages.installAnyway) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button @click="handleCancel">
|
||||||
|
<BanIcon />{{ formatMessage(messages.dontInstall) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<ButtonStyled type="outlined">
|
||||||
|
<button class="!border" @click="handleCancel">
|
||||||
|
<XIcon />{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button @click="accept">
|
||||||
|
<DownloadIcon />{{ formatMessage(messages.installButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<template v-if="reportMode" #actions>
|
||||||
|
<div class="flex justify-end gap-2">
|
||||||
|
<ButtonStyled type="outlined">
|
||||||
|
<button class="!border" :disabled="submitLoading" @click="handleCancel">
|
||||||
|
<XIcon />{{ formatMessage(commonMessages.cancelButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
<ButtonStyled color="brand">
|
||||||
|
<button :disabled="!canSubmitReport" @click="submitReport">
|
||||||
|
<SpinnerIcon v-if="submitLoading" class="animate-spin" />
|
||||||
|
<SendIcon v-else />
|
||||||
|
{{ formatMessage(commonMessages.reportButton) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</NewModal>
|
||||||
|
<ModpackContentModal
|
||||||
|
ref="contentModal"
|
||||||
|
:header="formatMessage(messages.sharedInstanceContent)"
|
||||||
|
:modpack-name="preview?.name ?? ''"
|
||||||
|
:modpack-icon-url="preview?.iconUrl ?? undefined"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
import { BanIcon, DownloadIcon, ReportIcon, SendIcon, SpinnerIcon, XIcon } from '@modrinth/assets'
|
||||||
|
import {
|
||||||
|
Admonition,
|
||||||
|
AutoLink,
|
||||||
|
ButtonStyled,
|
||||||
|
Checkbox,
|
||||||
|
Combobox,
|
||||||
|
type ComboboxOption,
|
||||||
|
commonMessages,
|
||||||
|
defineMessages,
|
||||||
|
injectModrinthClient,
|
||||||
|
injectNotificationManager,
|
||||||
|
IntlFormatted,
|
||||||
|
MarkdownEditor,
|
||||||
|
ModpackContentModal,
|
||||||
|
NewModal,
|
||||||
|
Table,
|
||||||
|
type TableColumn,
|
||||||
|
useScrollIndicator,
|
||||||
|
useVIntl,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
import { computed, nextTick, ref } from 'vue'
|
||||||
|
|
||||||
|
import { hide_ads_window, show_ads_window } from '@/helpers/ads'
|
||||||
|
import { toError } from '@/helpers/errors'
|
||||||
|
import type { SharedInstanceInstallPreview } from '@/helpers/install'
|
||||||
|
import { create_report } from '@/helpers/reports'
|
||||||
|
|
||||||
|
import SharedInstanceInstallSummary from './shared-instance-install-summary.vue'
|
||||||
|
import { useSharedInstancePreviewContent } from './use-shared-instance-preview-content'
|
||||||
|
|
||||||
|
type ExternalFileColumn = 'name'
|
||||||
|
type ExternalFileRow = {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const modal = ref<InstanceType<typeof NewModal>>()
|
||||||
|
const contentModal = ref<InstanceType<typeof ModpackContentModal>>()
|
||||||
|
const externalFileTable = ref<HTMLElement | null>(null)
|
||||||
|
const preview = ref<SharedInstanceInstallPreview | null>(null)
|
||||||
|
const install = ref<() => void | Promise<void>>(() => {})
|
||||||
|
const reportMode = ref(false)
|
||||||
|
const reportOnly = ref(false)
|
||||||
|
type ReportReason = 'malicious' | 'inappropriate' | 'spam'
|
||||||
|
const reportReason = ref<ReportReason>('malicious')
|
||||||
|
const additionalContext = ref('')
|
||||||
|
const deleteInstance = ref(true)
|
||||||
|
const submitLoading = ref(false)
|
||||||
|
const uploadedImageIDs = ref<string[]>([])
|
||||||
|
const emit = defineEmits<{
|
||||||
|
reported: [deleteInstance: boolean]
|
||||||
|
}>()
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const client = injectModrinthClient()
|
||||||
|
const { addNotification, handleError } = injectNotificationManager()
|
||||||
|
const { load } = useSharedInstancePreviewContent()
|
||||||
|
const {
|
||||||
|
showTopFade: showTableTopFade,
|
||||||
|
showBottomFade: showTableBottomFade,
|
||||||
|
checkScrollState: checkTableScrollState,
|
||||||
|
forceCheck: forceCheckTableScroll,
|
||||||
|
} = useScrollIndicator(externalFileTable)
|
||||||
|
const hasExternalFiles = computed(() => Boolean(preview.value?.externalFiles.length))
|
||||||
|
const externalFileRows = computed<ExternalFileRow[]>(() =>
|
||||||
|
(preview.value?.externalFiles ?? [])
|
||||||
|
.map((file, index) => ({
|
||||||
|
id: `${index}-${file.fileType}-${file.fileName}`,
|
||||||
|
name: file.fileName,
|
||||||
|
}))
|
||||||
|
.sort((left, right) => left.name.localeCompare(right.name)),
|
||||||
|
)
|
||||||
|
const reportReasonOptions = computed<ComboboxOption<ReportReason>[]>(() => [
|
||||||
|
{ value: 'malicious', label: formatMessage(messages.maliciousReason) },
|
||||||
|
{ value: 'inappropriate', label: formatMessage(messages.inappropriateReason) },
|
||||||
|
{ value: 'spam', label: formatMessage(messages.spamReason) },
|
||||||
|
])
|
||||||
|
const canSubmitReport = computed(
|
||||||
|
() => Boolean(preview.value && additionalContext.value.trim()) && !submitLoading.value,
|
||||||
|
)
|
||||||
|
|
||||||
|
async function accept() {
|
||||||
|
hide()
|
||||||
|
try {
|
||||||
|
await install.value()
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to install shared instance:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async function openViewContents() {
|
||||||
|
if (!preview.value) return
|
||||||
|
contentModal.value?.showLoading()
|
||||||
|
try {
|
||||||
|
contentModal.value?.show(await load(preview.value))
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Failed to load shared instance contents:', error)
|
||||||
|
contentModal.value?.show([])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async function submitReport() {
|
||||||
|
const reportPreview = preview.value
|
||||||
|
const body = additionalContext.value.trim()
|
||||||
|
if (!reportPreview || !body || submitLoading.value) return
|
||||||
|
|
||||||
|
submitLoading.value = true
|
||||||
|
try {
|
||||||
|
const uploadedImages = uploadedImageIDs.value.slice(-10)
|
||||||
|
await create_report({
|
||||||
|
report_type: reportReason.value,
|
||||||
|
item_type: 'shared-instance',
|
||||||
|
item_id: `${reportPreview.sharedInstanceId}/${reportPreview.version}`,
|
||||||
|
body,
|
||||||
|
uploaded_images: uploadedImages,
|
||||||
|
})
|
||||||
|
|
||||||
|
const shouldDeleteInstance = reportOnly.value && deleteInstance.value
|
||||||
|
hide()
|
||||||
|
addNotification({
|
||||||
|
type: 'success',
|
||||||
|
title: formatMessage(messages.reportSubmitted),
|
||||||
|
})
|
||||||
|
emit('reported', shouldDeleteInstance)
|
||||||
|
} catch (error) {
|
||||||
|
handleError(toError(error))
|
||||||
|
} finally {
|
||||||
|
submitLoading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async function onImageUpload(file: File) {
|
||||||
|
const imageExtensionByType: Partial<Record<string, Labrinth.Images.v3.ImageExtension>> = {
|
||||||
|
'image/gif': 'gif',
|
||||||
|
'image/jpeg': 'jpeg',
|
||||||
|
'image/png': 'png',
|
||||||
|
'image/webp': 'webp',
|
||||||
|
}
|
||||||
|
const extension = imageExtensionByType[file.type]
|
||||||
|
if (!extension) {
|
||||||
|
throw new Error(formatMessage(messages.invalidImageType))
|
||||||
|
}
|
||||||
|
if (file.size > 1024 * 1024) {
|
||||||
|
throw new Error(formatMessage(messages.imageTooLarge))
|
||||||
|
}
|
||||||
|
|
||||||
|
const image = await client.labrinth.images_v3.uploadImage(file, extension, {
|
||||||
|
context: 'report',
|
||||||
|
}).promise
|
||||||
|
uploadedImageIDs.value.push(image.id)
|
||||||
|
return image.url
|
||||||
|
}
|
||||||
|
function handleCancel() {
|
||||||
|
if (reportMode.value && !reportOnly.value) {
|
||||||
|
reportMode.value = false
|
||||||
|
void nextTick(() => forceCheckTableScroll())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
hide()
|
||||||
|
}
|
||||||
|
function handleHide() {
|
||||||
|
resetReportState()
|
||||||
|
show_ads_window()
|
||||||
|
}
|
||||||
|
function resetReportState() {
|
||||||
|
reportMode.value = false
|
||||||
|
reportOnly.value = false
|
||||||
|
reportReason.value = 'malicious'
|
||||||
|
additionalContext.value = ''
|
||||||
|
deleteInstance.value = true
|
||||||
|
submitLoading.value = false
|
||||||
|
uploadedImageIDs.value = []
|
||||||
|
}
|
||||||
|
function show(
|
||||||
|
previewValue: SharedInstanceInstallPreview,
|
||||||
|
installValue: () => void | Promise<void>,
|
||||||
|
event?: MouseEvent,
|
||||||
|
) {
|
||||||
|
resetReportState()
|
||||||
|
install.value = installValue
|
||||||
|
showPreview(previewValue, event)
|
||||||
|
}
|
||||||
|
function showReport(previewValue: SharedInstanceInstallPreview, event?: MouseEvent) {
|
||||||
|
resetReportState()
|
||||||
|
reportMode.value = true
|
||||||
|
reportOnly.value = true
|
||||||
|
install.value = () => {}
|
||||||
|
showPreview(previewValue, event)
|
||||||
|
}
|
||||||
|
function showPreview(previewValue: SharedInstanceInstallPreview, event?: MouseEvent) {
|
||||||
|
preview.value = previewValue
|
||||||
|
hide_ads_window()
|
||||||
|
modal.value?.show(event)
|
||||||
|
void nextTick(() => forceCheckTableScroll())
|
||||||
|
}
|
||||||
|
function hide() {
|
||||||
|
modal.value?.hide()
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
installToPlay: { id: 'app.modal.install-to-play.header', defaultMessage: 'Install to play' },
|
||||||
|
reportSharedInstance: {
|
||||||
|
id: 'app.modal.install-to-play.report-shared-instance-header',
|
||||||
|
defaultMessage: 'Report shared instance',
|
||||||
|
},
|
||||||
|
reportSubmitted: {
|
||||||
|
id: 'app.modal.install-to-play.report-submitted',
|
||||||
|
defaultMessage: 'Report submitted',
|
||||||
|
},
|
||||||
|
sharedInstanceContent: {
|
||||||
|
id: 'app.modal.install-to-play.shared-instance-content',
|
||||||
|
defaultMessage: 'Shared instance content',
|
||||||
|
},
|
||||||
|
inviteWarning: {
|
||||||
|
id: 'app.modal.install-to-play.invite-warning',
|
||||||
|
defaultMessage:
|
||||||
|
'This invite was created by another Modrinth user, not Modrinth. Only accept invites from people you trust.',
|
||||||
|
},
|
||||||
|
reportDescription: {
|
||||||
|
id: 'app.modal.install-to-play.report-description',
|
||||||
|
defaultMessage:
|
||||||
|
'Use this form to report instances that may violate our <rules-link>Rules</rules-link> or <terms-link>Terms of Use</terms-link>.',
|
||||||
|
},
|
||||||
|
supportAndBugReports: {
|
||||||
|
id: 'app.modal.install-to-play.report-support-and-bugs',
|
||||||
|
defaultMessage:
|
||||||
|
'For support requests, contact our <support-link>support team</support-link>. For bug reports, open a <github-link>GitHub issue</github-link>.',
|
||||||
|
},
|
||||||
|
legalClaims: {
|
||||||
|
id: 'app.modal.install-to-play.report-legal-claims',
|
||||||
|
defaultMessage:
|
||||||
|
'For DMCA notices or other legal claims, see our <copyright-link>Copyright Policy</copyright-link>.',
|
||||||
|
},
|
||||||
|
contentYouAreReporting: {
|
||||||
|
id: 'app.modal.install-to-play.content-you-are-reporting',
|
||||||
|
defaultMessage: 'Instance you’re reporting',
|
||||||
|
},
|
||||||
|
reportReason: {
|
||||||
|
id: 'app.modal.install-to-play.report-reason',
|
||||||
|
defaultMessage: 'Which rule does this instance violate?',
|
||||||
|
},
|
||||||
|
maliciousReason: {
|
||||||
|
id: 'app.modal.install-to-play.report-reason.malicious',
|
||||||
|
defaultMessage: 'Malicious',
|
||||||
|
},
|
||||||
|
inappropriateReason: {
|
||||||
|
id: 'app.modal.install-to-play.report-reason.inappropriate',
|
||||||
|
defaultMessage: 'Inappropriate',
|
||||||
|
},
|
||||||
|
spamReason: {
|
||||||
|
id: 'app.modal.install-to-play.report-reason.spam',
|
||||||
|
defaultMessage: 'Spam',
|
||||||
|
},
|
||||||
|
additionalContext: {
|
||||||
|
id: 'app.modal.install-to-play.additional-context',
|
||||||
|
defaultMessage: 'Additional context',
|
||||||
|
},
|
||||||
|
additionalContextPlaceholder: {
|
||||||
|
id: 'app.modal.install-to-play.additional-context-placeholder',
|
||||||
|
defaultMessage: 'Include links and images if possible and relevant',
|
||||||
|
},
|
||||||
|
invalidImageType: {
|
||||||
|
id: 'app.modal.install-to-play.report-image-invalid-type',
|
||||||
|
defaultMessage: 'File is not an accepted image type',
|
||||||
|
},
|
||||||
|
imageTooLarge: {
|
||||||
|
id: 'app.modal.install-to-play.report-image-too-large',
|
||||||
|
defaultMessage: 'File exceeds the 1 MiB size limit',
|
||||||
|
},
|
||||||
|
deleteInstance: {
|
||||||
|
id: 'app.modal.install-to-play.delete-instance',
|
||||||
|
defaultMessage: 'Delete instance',
|
||||||
|
},
|
||||||
|
unknownFilesWarning: {
|
||||||
|
id: 'app.modal.install-to-play.unknown-files-warning',
|
||||||
|
defaultMessage: 'Unknown files warning',
|
||||||
|
},
|
||||||
|
unknownFilesDescription: {
|
||||||
|
id: 'app.modal.install-to-play.shared-instance-unknown-files-description',
|
||||||
|
defaultMessage:
|
||||||
|
'This shared instance contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust.',
|
||||||
|
},
|
||||||
|
unrecognizedFiles: {
|
||||||
|
id: 'app.modal.install-to-play.unrecognized-files',
|
||||||
|
defaultMessage: 'Unrecognized files',
|
||||||
|
},
|
||||||
|
reviewedFiles: {
|
||||||
|
id: 'app.modal.install-to-play.reviewed-files',
|
||||||
|
defaultMessage:
|
||||||
|
'A file is only reviewed if it’s published to Modrinth, regardless of its file format (including .mrpack).',
|
||||||
|
},
|
||||||
|
installAnyway: {
|
||||||
|
id: 'app.modal.install-to-play.install-anyway',
|
||||||
|
defaultMessage: 'Install anyway',
|
||||||
|
},
|
||||||
|
dontInstall: {
|
||||||
|
id: 'app.modal.install-to-play.external-files-dont-install',
|
||||||
|
defaultMessage: "Don't install",
|
||||||
|
},
|
||||||
|
installButton: { id: 'app.modal.install-to-play.install-button', defaultMessage: 'Install' },
|
||||||
|
})
|
||||||
|
|
||||||
|
const externalFileColumns = computed<TableColumn<ExternalFileColumn>[]>(() => [
|
||||||
|
{
|
||||||
|
key: 'name',
|
||||||
|
label: formatMessage(messages.unrecognizedFiles),
|
||||||
|
cellClass: '!h-12',
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
defineExpose({ show, showReport, hide })
|
||||||
|
</script>
|
||||||
+60
@@ -0,0 +1,60 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex flex-col gap-2.5">
|
||||||
|
<div class="flex items-center justify-between">
|
||||||
|
<span class="font-semibold text-contrast">{{
|
||||||
|
heading ?? formatMessage(messages.sharedInstance)
|
||||||
|
}}</span>
|
||||||
|
<ButtonStyled type="transparent">
|
||||||
|
<button @click="emit('viewContents')">
|
||||||
|
<EyeIcon />
|
||||||
|
{{ formatMessage(messages.viewContents) }}
|
||||||
|
</button>
|
||||||
|
</ButtonStyled>
|
||||||
|
</div>
|
||||||
|
<div class="flex items-center gap-3 rounded-2xl bg-surface-2 p-3">
|
||||||
|
<Avatar
|
||||||
|
:src="preview.iconUrl"
|
||||||
|
:alt="preview.name"
|
||||||
|
size="56px"
|
||||||
|
no-shadow
|
||||||
|
class="!rounded-2xl"
|
||||||
|
/>
|
||||||
|
<div class="flex min-w-0 flex-col gap-0.5">
|
||||||
|
<span class="truncate font-semibold text-contrast">{{ preview.name }}</span>
|
||||||
|
<span class="truncate text-sm font-medium text-secondary">
|
||||||
|
{{ loaderDisplay }} {{ preview.gameVersion }}
|
||||||
|
<template v-if="preview.modCount">
|
||||||
|
· {{ formatMessage(messages.modCount, { count: preview.modCount }) }}
|
||||||
|
</template>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { EyeIcon } from '@modrinth/assets'
|
||||||
|
import { Avatar, ButtonStyled, defineMessages, formatLoader, useVIntl } from '@modrinth/ui'
|
||||||
|
import { computed, toRefs } from 'vue'
|
||||||
|
|
||||||
|
import type { SharedInstanceInstallPreview } from '@/helpers/install'
|
||||||
|
|
||||||
|
const props = defineProps<{ preview: SharedInstanceInstallPreview; heading?: string }>()
|
||||||
|
const { preview, heading } = toRefs(props)
|
||||||
|
const emit = defineEmits<{ viewContents: [] }>()
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const loaderDisplay = computed(() =>
|
||||||
|
preview.value.loader ? formatLoader(formatMessage, preview.value.loader) : '',
|
||||||
|
)
|
||||||
|
const messages = defineMessages({
|
||||||
|
sharedInstance: {
|
||||||
|
id: 'app.modal.install-to-play.shared-instance',
|
||||||
|
defaultMessage: 'Shared instance',
|
||||||
|
},
|
||||||
|
viewContents: { id: 'app.modal.install-to-play.view-contents', defaultMessage: 'View contents' },
|
||||||
|
modCount: {
|
||||||
|
id: 'app.modal.install-to-play.mod-count',
|
||||||
|
defaultMessage: '{count, plural, one {# mod} other {# mods}}',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
+135
@@ -0,0 +1,135 @@
|
|||||||
|
import type { Labrinth } from '@modrinth/api-client'
|
||||||
|
import type { ContentItem } from '@modrinth/ui'
|
||||||
|
|
||||||
|
import { get_project_many, get_version, get_version_many } from '@/helpers/cache.js'
|
||||||
|
import type { SharedInstanceInstallPreview } from '@/helpers/install'
|
||||||
|
|
||||||
|
type VersionDependency = Labrinth.Versions.v2.Dependency & { version_id?: string }
|
||||||
|
|
||||||
|
export function useSharedInstancePreviewContent() {
|
||||||
|
async function load(preview: SharedInstanceInstallPreview): Promise<ContentItem[]> {
|
||||||
|
return [
|
||||||
|
...preview.externalFiles.map(externalFileContentItem),
|
||||||
|
...(await modpackContentItems(preview)),
|
||||||
|
...(await contentItemsFromVersionIds(
|
||||||
|
preview.contentVersionIds.filter((id) => id !== preview.modpackVersionId),
|
||||||
|
)),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
async function modpackContentItems(preview: SharedInstanceInstallPreview) {
|
||||||
|
if (!preview.modpackVersionId) return []
|
||||||
|
const version = await get_version(preview.modpackVersionId, 'must_revalidate')
|
||||||
|
return await contentItemsFromDependencies(version?.dependencies ?? [])
|
||||||
|
}
|
||||||
|
|
||||||
|
async function contentItemsFromDependencies(dependencies: Labrinth.Versions.v2.Dependency[]) {
|
||||||
|
const deps = dependencies as VersionDependency[]
|
||||||
|
const projectIds = unique(deps.map((dep) => dep.project_id).filter((id): id is string => !!id))
|
||||||
|
const versionIds = unique(deps.map((dep) => dep.version_id).filter((id): id is string => !!id))
|
||||||
|
const [projects, versions]: [Labrinth.Projects.v2.Project[], Labrinth.Versions.v2.Version[]] =
|
||||||
|
await Promise.all([
|
||||||
|
projectIds.length ? get_project_many(projectIds, 'must_revalidate') : [],
|
||||||
|
versionIds.length ? get_version_many(versionIds, 'must_revalidate') : [],
|
||||||
|
])
|
||||||
|
const projectMap = new Map(projects.map((project) => [project.id, project]))
|
||||||
|
const versionMap = new Map(versions.map((version) => [version.id, version]))
|
||||||
|
|
||||||
|
return deps.map((dependency): ContentItem => {
|
||||||
|
const project = dependency.project_id ? projectMap.get(dependency.project_id) : null
|
||||||
|
const version = dependency.version_id ? versionMap.get(dependency.version_id) : null
|
||||||
|
const fileName =
|
||||||
|
version?.files?.[0]?.filename ?? dependency.file_name ?? project?.title ?? 'Unknown'
|
||||||
|
return contentItem(
|
||||||
|
version?.id ?? project?.id ?? fileName,
|
||||||
|
fileName,
|
||||||
|
project,
|
||||||
|
version,
|
||||||
|
!project && !version,
|
||||||
|
dependency.project_id ?? fileName,
|
||||||
|
dependency.file_name ?? fileName,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async function contentItemsFromVersionIds(versionIds: string[]) {
|
||||||
|
const versions: Labrinth.Versions.v2.Version[] = versionIds.length
|
||||||
|
? await get_version_many(unique(versionIds), 'must_revalidate')
|
||||||
|
: []
|
||||||
|
const projectIds = unique(versions.map((version) => version.project_id).filter(Boolean))
|
||||||
|
const projects: Labrinth.Projects.v2.Project[] = projectIds.length
|
||||||
|
? await get_project_many(projectIds, 'must_revalidate')
|
||||||
|
: []
|
||||||
|
const projectMap = new Map(projects.map((project) => [project.id, project]))
|
||||||
|
return versions.map((version): ContentItem => {
|
||||||
|
const project = projectMap.get(version.project_id)
|
||||||
|
const fileName = version.files?.[0]?.filename ?? project?.title ?? version.name ?? 'Unknown'
|
||||||
|
return contentItem(
|
||||||
|
version.id,
|
||||||
|
fileName,
|
||||||
|
project,
|
||||||
|
version,
|
||||||
|
false,
|
||||||
|
version.project_id,
|
||||||
|
version.name,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return { load }
|
||||||
|
}
|
||||||
|
|
||||||
|
function contentItem(
|
||||||
|
id: string,
|
||||||
|
fileName: string,
|
||||||
|
project?: Labrinth.Projects.v2.Project | null,
|
||||||
|
version?: Labrinth.Versions.v2.Version | null,
|
||||||
|
external = false,
|
||||||
|
fallbackProjectId = id,
|
||||||
|
fallbackTitle = fileName,
|
||||||
|
projectType = project?.project_type ?? 'mod',
|
||||||
|
): ContentItem {
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
file_name: fileName,
|
||||||
|
project_type: projectType,
|
||||||
|
has_update: false,
|
||||||
|
update_version_id: null,
|
||||||
|
external,
|
||||||
|
project: {
|
||||||
|
id: project?.id ?? fallbackProjectId,
|
||||||
|
slug: project?.slug ?? fallbackProjectId,
|
||||||
|
title: project?.title ?? fallbackTitle,
|
||||||
|
icon_url: project?.icon_url ?? undefined,
|
||||||
|
},
|
||||||
|
...(version
|
||||||
|
? {
|
||||||
|
version: {
|
||||||
|
id: version.id,
|
||||||
|
file_name: fileName,
|
||||||
|
version_number: version.version_number ?? undefined,
|
||||||
|
date_published: version.date_published ?? undefined,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function externalFileContentItem(
|
||||||
|
file: SharedInstanceInstallPreview['externalFiles'][number],
|
||||||
|
): ContentItem {
|
||||||
|
return contentItem(
|
||||||
|
`external:${file.fileType}:${file.fileName}`,
|
||||||
|
file.fileName,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
file.fileName,
|
||||||
|
file.fileName,
|
||||||
|
file.fileType,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function unique<T>(values: T[]) {
|
||||||
|
return Array.from(new Set(values))
|
||||||
|
}
|
||||||
+48
@@ -0,0 +1,48 @@
|
|||||||
|
<template>
|
||||||
|
<ModrinthAccountRequiredModal ref="accountRequiredModal" :request-auth="requestAuth" />
|
||||||
|
<SharedInstanceInstallModal ref="installModal" />
|
||||||
|
<SharedInstanceAlreadyInstalledModal
|
||||||
|
ref="alreadyInstalledModal"
|
||||||
|
@cancel="handleAlreadyInstalledCancel"
|
||||||
|
@go-to-instance="handleAlreadyInstalledGoToInstance"
|
||||||
|
@install-anyway="handleAlreadyInstalledInstallAnyway"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { injectAuth } from '@modrinth/ui'
|
||||||
|
import { nextTick, ref } from 'vue'
|
||||||
|
|
||||||
|
import ModrinthAccountRequiredModal from '@/components/ui/modal/ModrinthAccountRequiredModal.vue'
|
||||||
|
import SharedInstanceInstallModal from '@/components/ui/shared-instances/shared-instance-install-modal/index.vue'
|
||||||
|
import SharedInstanceAlreadyInstalledModal from '@/components/ui/shared-instances/SharedInstanceAlreadyInstalledModal.vue'
|
||||||
|
import type { ModrinthAuthFlow } from '@/helpers/mr_auth'
|
||||||
|
|
||||||
|
import type { SharedInstanceInviteHandler } from './shared-instance-invite-types'
|
||||||
|
import { useSharedInstanceInviteHandler } from './use-shared-instance-invite-handler'
|
||||||
|
|
||||||
|
const auth = injectAuth()
|
||||||
|
const installModal = ref<InstanceType<typeof SharedInstanceInstallModal>>()
|
||||||
|
const alreadyInstalledModal = ref<InstanceType<typeof SharedInstanceAlreadyInstalledModal>>()
|
||||||
|
const accountRequiredModal = ref<InstanceType<typeof ModrinthAccountRequiredModal>>()
|
||||||
|
const {
|
||||||
|
handleNotification,
|
||||||
|
installFromInviteId,
|
||||||
|
clearNotifications,
|
||||||
|
handleAlreadyInstalledCancel,
|
||||||
|
handleAlreadyInstalledGoToInstance,
|
||||||
|
handleAlreadyInstalledInstallAnyway,
|
||||||
|
} = useSharedInstanceInviteHandler(installModal, alreadyInstalledModal, accountRequiredModal)
|
||||||
|
|
||||||
|
async function requestAuth(flow: ModrinthAuthFlow) {
|
||||||
|
await auth.requestSignIn('', flow, { showModal: false })
|
||||||
|
await nextTick()
|
||||||
|
return !!auth.session_token.value
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose<SharedInstanceInviteHandler>({
|
||||||
|
handleNotification,
|
||||||
|
installFromInviteId,
|
||||||
|
clearNotifications,
|
||||||
|
})
|
||||||
|
</script>
|
||||||
+29
@@ -0,0 +1,29 @@
|
|||||||
|
import type {
|
||||||
|
AppNotification,
|
||||||
|
SharedInstanceInvite,
|
||||||
|
SharedInstanceInviteNotificationBody,
|
||||||
|
} from './shared-instance-invite-types'
|
||||||
|
|
||||||
|
function optionalString(value: unknown) {
|
||||||
|
return typeof value === 'string' ? value : null
|
||||||
|
}
|
||||||
|
|
||||||
|
export function parseSharedInstanceInviteNotification(
|
||||||
|
notification: AppNotification,
|
||||||
|
): SharedInstanceInvite | null {
|
||||||
|
if (notification.body?.type !== 'shared_instance_invite') return null
|
||||||
|
|
||||||
|
const body = notification.body as SharedInstanceInviteNotificationBody
|
||||||
|
const sharedInstanceId = optionalString(body.shared_instance_id)
|
||||||
|
const sharedInstanceName = optionalString(body.shared_instance_name)
|
||||||
|
if (!sharedInstanceId || !sharedInstanceName) return null
|
||||||
|
|
||||||
|
return {
|
||||||
|
sharedInstanceId,
|
||||||
|
sharedInstanceName,
|
||||||
|
invitedById: optionalString(body.invited_by),
|
||||||
|
invitedByUsername: optionalString(body.invited_by_username),
|
||||||
|
invitedByAvatarUrl: optionalString(body.invited_by_avatar_url),
|
||||||
|
instanceIconUrl: optionalString(body.shared_instance_icon),
|
||||||
|
}
|
||||||
|
}
|
||||||
+30
@@ -0,0 +1,30 @@
|
|||||||
|
export type SharedInstanceInviteNotificationBody = {
|
||||||
|
type: 'shared_instance_invite'
|
||||||
|
shared_instance_id?: unknown
|
||||||
|
shared_instance_name?: unknown
|
||||||
|
invited_by?: unknown
|
||||||
|
invited_by_username?: unknown
|
||||||
|
invited_by_avatar_url?: unknown
|
||||||
|
shared_instance_icon?: unknown
|
||||||
|
}
|
||||||
|
|
||||||
|
export type AppNotification = {
|
||||||
|
id: string | number
|
||||||
|
read?: boolean
|
||||||
|
body?: { type?: unknown } & Record<string, unknown>
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SharedInstanceInvite = {
|
||||||
|
sharedInstanceId: string
|
||||||
|
sharedInstanceName: string
|
||||||
|
invitedById: string | null
|
||||||
|
invitedByUsername: string | null
|
||||||
|
invitedByAvatarUrl: string | null
|
||||||
|
instanceIconUrl: string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SharedInstanceInviteHandler = {
|
||||||
|
handleNotification(notification: AppNotification): Promise<boolean>
|
||||||
|
installFromInviteId(inviteId: string): Promise<void>
|
||||||
|
clearNotifications(): void
|
||||||
|
}
|
||||||
+282
@@ -0,0 +1,282 @@
|
|||||||
|
import { ModrinthApiError } from '@modrinth/api-client'
|
||||||
|
import {
|
||||||
|
injectAuth,
|
||||||
|
injectModrinthClient,
|
||||||
|
injectNotificationManager,
|
||||||
|
injectPopupNotificationManager,
|
||||||
|
} from '@modrinth/ui'
|
||||||
|
import { useQueryClient } from '@tanstack/vue-query'
|
||||||
|
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||||
|
import { type Ref, watch } from 'vue'
|
||||||
|
import { useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
import { config } from '@/config'
|
||||||
|
import { get_user } from '@/helpers/cache'
|
||||||
|
import { toError } from '@/helpers/errors'
|
||||||
|
import {
|
||||||
|
install_accept_shared_instance_invite,
|
||||||
|
install_get_shared_instance_preview,
|
||||||
|
install_shared_instance,
|
||||||
|
} from '@/helpers/install'
|
||||||
|
import { list } from '@/helpers/instance'
|
||||||
|
import { useTheming } from '@/store/state'
|
||||||
|
|
||||||
|
import { parseSharedInstanceInviteNotification } from './shared-instance-invite-parser'
|
||||||
|
import type { AppNotification, SharedInstanceInvite } from './shared-instance-invite-types'
|
||||||
|
|
||||||
|
type InstallModal = {
|
||||||
|
show(
|
||||||
|
preview: Awaited<ReturnType<typeof install_get_shared_instance_preview>>,
|
||||||
|
install: () => Promise<void>,
|
||||||
|
): void
|
||||||
|
}
|
||||||
|
|
||||||
|
type AccountRequiredModal = {
|
||||||
|
show(event?: MouseEvent): Promise<boolean>
|
||||||
|
}
|
||||||
|
|
||||||
|
type AlreadyInstalledModal = {
|
||||||
|
show(instanceName: string): void
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useSharedInstanceInviteHandler(
|
||||||
|
installModal: Ref<InstallModal | undefined>,
|
||||||
|
alreadyInstalledModal: Ref<AlreadyInstalledModal | undefined>,
|
||||||
|
accountRequiredModal: Ref<AccountRequiredModal | undefined>,
|
||||||
|
) {
|
||||||
|
const auth = injectAuth()
|
||||||
|
const client = injectModrinthClient()
|
||||||
|
const { handleError } = injectNotificationManager()
|
||||||
|
const popupNotificationManager = injectPopupNotificationManager()
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const router = useRouter()
|
||||||
|
const themeStore = useTheming()
|
||||||
|
const displayedNotifications = new Set<string | number>()
|
||||||
|
const displayedNotificationKeys = new Set<string>()
|
||||||
|
const popupNotificationIds = new Set<string | number>()
|
||||||
|
let notificationGeneration = 0
|
||||||
|
let pendingAlreadyInstalled:
|
||||||
|
| {
|
||||||
|
instanceId: string
|
||||||
|
preview: Awaited<ReturnType<typeof install_get_shared_instance_preview>>
|
||||||
|
install: () => Promise<void>
|
||||||
|
onGoToInstance?: () => void | Promise<void>
|
||||||
|
}
|
||||||
|
| undefined
|
||||||
|
|
||||||
|
async function markNotificationRead(notification: AppNotification) {
|
||||||
|
try {
|
||||||
|
await client.labrinth.notifications_v2.markAsRead(String(notification.id))
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof ModrinthApiError && error.statusCode === 404) return
|
||||||
|
throw error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function resolveInvite(invite: SharedInstanceInvite) {
|
||||||
|
const [invitedBy, sharedInstance] = await Promise.all([
|
||||||
|
!invite.invitedByUsername && invite.invitedById
|
||||||
|
? get_user(invite.invitedById, 'bypass').catch(() => null)
|
||||||
|
: null,
|
||||||
|
client.sharedinstances.instances_v1.get(invite.sharedInstanceId).catch(() => null),
|
||||||
|
])
|
||||||
|
|
||||||
|
return {
|
||||||
|
...invite,
|
||||||
|
invitedByUsername: invite.invitedByUsername ?? invitedBy?.username ?? null,
|
||||||
|
invitedByAvatarUrl: invite.invitedByAvatarUrl ?? invitedBy?.avatar_url ?? null,
|
||||||
|
instanceIconUrl: sharedInstance ? sharedInstance.icon : invite.instanceIconUrl,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showInstall(
|
||||||
|
preview: Awaited<ReturnType<typeof install_get_shared_instance_preview>>,
|
||||||
|
install: () => Promise<void>,
|
||||||
|
) {
|
||||||
|
if (!installModal.value) throw new Error('Shared instance install modal is not available.')
|
||||||
|
installModal.value.show(preview, install)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function showInstallOrAlreadyInstalled(
|
||||||
|
sharedInstanceId: string,
|
||||||
|
preview: Awaited<ReturnType<typeof install_get_shared_instance_preview>>,
|
||||||
|
install: () => Promise<void>,
|
||||||
|
onGoToInstance?: () => void | Promise<void>,
|
||||||
|
) {
|
||||||
|
const existingInstance = (await list()).find(
|
||||||
|
(instance) => instance.shared_instance?.id === sharedInstanceId,
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!existingInstance || themeStore.getFeatureFlag('skip_non_essential_warnings')) {
|
||||||
|
showInstall(preview, install)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!alreadyInstalledModal.value) {
|
||||||
|
throw new Error('Shared instance already installed modal is not available.')
|
||||||
|
}
|
||||||
|
|
||||||
|
pendingAlreadyInstalled = {
|
||||||
|
instanceId: existingInstance.id,
|
||||||
|
preview,
|
||||||
|
install,
|
||||||
|
onGoToInstance,
|
||||||
|
}
|
||||||
|
alreadyInstalledModal.value.show(existingInstance.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleAlreadyInstalledCancel() {
|
||||||
|
pendingAlreadyInstalled = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleAlreadyInstalledGoToInstance() {
|
||||||
|
const pending = pendingAlreadyInstalled
|
||||||
|
pendingAlreadyInstalled = undefined
|
||||||
|
if (!pending) return
|
||||||
|
|
||||||
|
if (pending.onGoToInstance) {
|
||||||
|
try {
|
||||||
|
await pending.onGoToInstance()
|
||||||
|
} catch (error) {
|
||||||
|
handleError(toError(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await router.push(`/instance/${encodeURIComponent(pending.instanceId)}/`)
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleAlreadyInstalledInstallAnyway() {
|
||||||
|
const pending = pendingAlreadyInstalled
|
||||||
|
pendingAlreadyInstalled = undefined
|
||||||
|
if (!pending) return
|
||||||
|
showInstall(pending.preview, pending.install)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function acceptNotification(notification: AppNotification, invite: SharedInstanceInvite) {
|
||||||
|
try {
|
||||||
|
const preview = await install_get_shared_instance_preview(
|
||||||
|
invite.sharedInstanceId,
|
||||||
|
invite.sharedInstanceName,
|
||||||
|
)
|
||||||
|
if (invite.instanceIconUrl) preview.iconUrl = invite.instanceIconUrl
|
||||||
|
|
||||||
|
await showInstallOrAlreadyInstalled(
|
||||||
|
invite.sharedInstanceId,
|
||||||
|
preview,
|
||||||
|
async () => {
|
||||||
|
await install_shared_instance(
|
||||||
|
invite.sharedInstanceId,
|
||||||
|
invite.sharedInstanceName,
|
||||||
|
invite.invitedById,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
invite.instanceIconUrl,
|
||||||
|
)
|
||||||
|
await markNotificationRead(notification)
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['instances'] })
|
||||||
|
},
|
||||||
|
() => markNotificationRead(notification),
|
||||||
|
)
|
||||||
|
} catch (error) {
|
||||||
|
handleError(toError(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleNotification(notification: AppNotification) {
|
||||||
|
const parsedInvite = parseSharedInstanceInviteNotification(notification)
|
||||||
|
if (!parsedInvite) return false
|
||||||
|
if (displayedNotifications.has(notification.id)) return true
|
||||||
|
|
||||||
|
const generation = notificationGeneration
|
||||||
|
displayedNotifications.add(notification.id)
|
||||||
|
const invite = await resolveInvite(parsedInvite)
|
||||||
|
if (generation !== notificationGeneration) return true
|
||||||
|
|
||||||
|
const notificationKey = JSON.stringify([
|
||||||
|
invite.invitedById ?? invite.invitedByUsername,
|
||||||
|
invite.sharedInstanceName,
|
||||||
|
invite.instanceIconUrl,
|
||||||
|
])
|
||||||
|
if (displayedNotificationKeys.has(notificationKey)) {
|
||||||
|
await markNotificationRead(notification).catch((error) => handleError(toError(error)))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
displayedNotificationKeys.add(notificationKey)
|
||||||
|
const popupNotification = popupNotificationManager.addPopupNotification({
|
||||||
|
title: invite.sharedInstanceName,
|
||||||
|
autoCloseMs: null,
|
||||||
|
toast: {
|
||||||
|
type: 'instance-invite',
|
||||||
|
actorName: invite.invitedByUsername,
|
||||||
|
actorAvatarUrl: invite.invitedByAvatarUrl ?? undefined,
|
||||||
|
entityName: invite.sharedInstanceName,
|
||||||
|
entityIconUrl: invite.instanceIconUrl ?? undefined,
|
||||||
|
onAccept: () => acceptNotification(notification, invite),
|
||||||
|
onDecline: () =>
|
||||||
|
markNotificationRead(notification).catch((error) => handleError(toError(error))),
|
||||||
|
onOpenActor: () => {
|
||||||
|
if (invite.invitedByUsername) {
|
||||||
|
openUrl(`${config.siteUrl}/user/${encodeURIComponent(invite.invitedByUsername)}`)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
popupNotificationIds.add(popupNotification.id)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearNotifications() {
|
||||||
|
notificationGeneration++
|
||||||
|
for (const id of popupNotificationIds) {
|
||||||
|
popupNotificationManager.removeNotification(id)
|
||||||
|
}
|
||||||
|
displayedNotifications.clear()
|
||||||
|
displayedNotificationKeys.clear()
|
||||||
|
popupNotificationIds.clear()
|
||||||
|
pendingAlreadyInstalled = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
async function requireAccount() {
|
||||||
|
if (!auth.isReady?.value) {
|
||||||
|
await new Promise<void>((resolve) => {
|
||||||
|
const stop = watch(auth.isReady!, (ready) => {
|
||||||
|
if (ready) {
|
||||||
|
stop()
|
||||||
|
resolve()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (auth.session_token.value) return true
|
||||||
|
return (await accountRequiredModal.value?.show()) ?? false
|
||||||
|
}
|
||||||
|
|
||||||
|
async function installFromInviteId(inviteId: string) {
|
||||||
|
try {
|
||||||
|
if (!(await requireAccount())) return
|
||||||
|
const invite = await install_accept_shared_instance_invite(inviteId)
|
||||||
|
await showInstallOrAlreadyInstalled(invite.sharedInstanceId, invite.preview, async () => {
|
||||||
|
await install_shared_instance(
|
||||||
|
invite.sharedInstanceId,
|
||||||
|
invite.preview.name,
|
||||||
|
invite.managerId,
|
||||||
|
invite.serverManagerName,
|
||||||
|
invite.serverManagerIconUrl,
|
||||||
|
invite.instanceIconUrl,
|
||||||
|
)
|
||||||
|
await queryClient.invalidateQueries({ queryKey: ['instances'] })
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
handleError(toError(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
handleNotification,
|
||||||
|
installFromInviteId,
|
||||||
|
clearNotifications,
|
||||||
|
handleAlreadyInstalledCancel,
|
||||||
|
handleAlreadyInstalledGoToInstance,
|
||||||
|
handleAlreadyInstalledInstallAnyway,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,7 @@
|
|||||||
<SkinPreviewRenderer
|
<SkinPreviewRenderer
|
||||||
:variant="variant"
|
:variant="variant"
|
||||||
:texture-src="previewSkin || ''"
|
:texture-src="previewSkin || ''"
|
||||||
|
:ears-texture-src="uploadedTextureUrl?.original ?? currentSkin?.texture"
|
||||||
:cape-src="selectedCapeTexture"
|
:cape-src="selectedCapeTexture"
|
||||||
framing="modal"
|
framing="modal"
|
||||||
:initial-rotation="Math.PI / 8"
|
:initial-rotation="Math.PI / 8"
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ const playing = ref(false)
|
|||||||
|
|
||||||
const play = async (event: MouseEvent) => {
|
const play = async (event: MouseEvent) => {
|
||||||
event?.stopPropagation()
|
event?.stopPropagation()
|
||||||
|
if (props.instance.quarantined) return
|
||||||
loading.value = true
|
loading.value = true
|
||||||
await run(props.instance.id)
|
await run(props.instance.id)
|
||||||
.catch((err) => handleSevereError(err, { instanceId: props.instance.id }))
|
.catch((err) => handleSevereError(err, { instanceId: props.instance.id }))
|
||||||
@@ -192,8 +193,14 @@ onUnmounted(() => {
|
|||||||
</ButtonStyled>
|
</ButtonStyled>
|
||||||
<ButtonStyled v-else>
|
<ButtonStyled v-else>
|
||||||
<button
|
<button
|
||||||
v-tooltip="playing ? 'Instance is already open' : null"
|
v-tooltip="
|
||||||
:disabled="playing || loading"
|
instance.quarantined
|
||||||
|
? 'This instance has been locked'
|
||||||
|
: playing
|
||||||
|
? 'Instance is already open'
|
||||||
|
: null
|
||||||
|
"
|
||||||
|
:disabled="instance.quarantined || playing || loading"
|
||||||
@click="play"
|
@click="play"
|
||||||
>
|
>
|
||||||
<SpinnerIcon v-if="loading" class="animate-spin" />
|
<SpinnerIcon v-if="loading" class="animate-spin" />
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ function refreshServer(address: string, instanceId: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function joinWorld(world: WorldWithInstance, instance?: GameInstance) {
|
async function joinWorld(world: WorldWithInstance, instance?: GameInstance) {
|
||||||
|
if (instance?.quarantined) return
|
||||||
console.log(`Joining world ${getWorldIdentifier(world)}`)
|
console.log(`Joining world ${getWorldIdentifier(world)}`)
|
||||||
if (world.type === 'server') {
|
if (world.type === 'server') {
|
||||||
await start_join_server(world.instance_id, world.address).catch(handleError)
|
await start_join_server(world.instance_id, world.address).catch(handleError)
|
||||||
@@ -192,6 +193,7 @@ async function joinWorld(world: WorldWithInstance, instance?: GameInstance) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function playInstance(instance: GameInstance) {
|
async function playInstance(instance: GameInstance) {
|
||||||
|
if (instance.quarantined) return
|
||||||
await run(instance.id)
|
await run(instance.id)
|
||||||
.catch((err) => handleSevereError(err, { instanceId: instance.id }))
|
.catch((err) => handleSevereError(err, { instanceId: instance.id }))
|
||||||
.finally(() => {
|
.finally(() => {
|
||||||
@@ -300,6 +302,7 @@ onUnmounted(() => {
|
|||||||
item.world.type === 'singleplayer' &&
|
item.world.type === 'singleplayer' &&
|
||||||
hasWorldQuickPlaySupport(gameVersions, item.instance.game_version || '')
|
hasWorldQuickPlaySupport(gameVersions, item.instance.game_version || '')
|
||||||
"
|
"
|
||||||
|
:quarantined="item.instance.quarantined"
|
||||||
:server-status="
|
:server-status="
|
||||||
item.world.type === 'server' ? serverData[item.world.address].status : undefined
|
item.world.type === 'server' ? serverData[item.world.address].status : undefined
|
||||||
"
|
"
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ const props = withDefaults(
|
|||||||
startingInstance?: boolean
|
startingInstance?: boolean
|
||||||
supportsServerQuickPlay?: boolean
|
supportsServerQuickPlay?: boolean
|
||||||
supportsWorldQuickPlay?: boolean
|
supportsWorldQuickPlay?: boolean
|
||||||
|
quarantined?: boolean
|
||||||
currentProtocol?: ProtocolVersion | null
|
currentProtocol?: ProtocolVersion | null
|
||||||
highlighted?: boolean
|
highlighted?: boolean
|
||||||
|
|
||||||
@@ -105,6 +106,7 @@ const props = withDefaults(
|
|||||||
startingInstance: false,
|
startingInstance: false,
|
||||||
supportsServerQuickPlay: true,
|
supportsServerQuickPlay: true,
|
||||||
supportsWorldQuickPlay: false,
|
supportsWorldQuickPlay: false,
|
||||||
|
quarantined: false,
|
||||||
currentProtocol: null,
|
currentProtocol: null,
|
||||||
|
|
||||||
refreshing: false,
|
refreshing: false,
|
||||||
@@ -139,7 +141,7 @@ const managed = computed(() => props.managed)
|
|||||||
const shortcutInstanceId = computed(() => props.shortcutInstanceId ?? props.instanceId)
|
const shortcutInstanceId = computed(() => props.shortcutInstanceId ?? props.instanceId)
|
||||||
|
|
||||||
async function createShortcut() {
|
async function createShortcut() {
|
||||||
if (!shortcutInstanceId.value) return
|
if (!shortcutInstanceId.value || props.quarantined) return
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const shortcutPath = await createInstanceShortcut(
|
const shortcutPath = await createInstanceShortcut(
|
||||||
@@ -422,23 +424,26 @@ const messages = defineMessages({
|
|||||||
<ButtonStyled v-else>
|
<ButtonStyled v-else>
|
||||||
<button
|
<button
|
||||||
v-tooltip="
|
v-tooltip="
|
||||||
world.type === 'server'
|
quarantined
|
||||||
? !supportsServerQuickPlay
|
? 'This instance has been locked'
|
||||||
? formatMessage(messages.noServerQuickPlay)
|
: world.type === 'server'
|
||||||
: playingOtherWorld
|
? !supportsServerQuickPlay
|
||||||
? formatMessage(messages.gameAlreadyOpen)
|
? formatMessage(messages.noServerQuickPlay)
|
||||||
: !serverStatus
|
: playingOtherWorld
|
||||||
? formatMessage(messages.noContact)
|
? formatMessage(messages.gameAlreadyOpen)
|
||||||
: serverIncompatible
|
: !serverStatus
|
||||||
? formatMessage(messages.incompatibleServer)
|
? formatMessage(messages.noContact)
|
||||||
: null
|
: serverIncompatible
|
||||||
: !supportsWorldQuickPlay
|
? formatMessage(messages.incompatibleServer)
|
||||||
? formatMessage(messages.noSingleplayerQuickPlay)
|
: null
|
||||||
: playingOtherWorld || locked
|
: !supportsWorldQuickPlay
|
||||||
? formatMessage(messages.gameAlreadyOpen)
|
? formatMessage(messages.noSingleplayerQuickPlay)
|
||||||
: null
|
: playingOtherWorld || locked
|
||||||
|
? formatMessage(messages.gameAlreadyOpen)
|
||||||
|
: null
|
||||||
"
|
"
|
||||||
:disabled="
|
:disabled="
|
||||||
|
quarantined ||
|
||||||
playingOtherWorld ||
|
playingOtherWorld ||
|
||||||
startingInstance ||
|
startingInstance ||
|
||||||
(world.type == 'server' && !supportsServerQuickPlay) ||
|
(world.type == 'server' && !supportsServerQuickPlay) ||
|
||||||
@@ -457,7 +462,7 @@ const messages = defineMessages({
|
|||||||
{
|
{
|
||||||
id: 'play-instance',
|
id: 'play-instance',
|
||||||
shown: !!instanceId,
|
shown: !!instanceId,
|
||||||
disabled: playingInstance,
|
disabled: playingInstance || quarantined,
|
||||||
action: () => emit('play-instance'),
|
action: () => emit('play-instance'),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -511,7 +516,7 @@ const messages = defineMessages({
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
id: 'create-shortcut',
|
id: 'create-shortcut',
|
||||||
shown: !!shortcutInstanceId,
|
shown: !!shortcutInstanceId && !quarantined,
|
||||||
action: () => createShortcut(),
|
action: () => createShortcut(),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -53,6 +53,10 @@ const messages = defineMessages({
|
|||||||
id: 'app.action-bar.install.unknown-instance',
|
id: 'app.action-bar.install.unknown-instance',
|
||||||
defaultMessage: 'Unknown instance',
|
defaultMessage: 'Unknown instance',
|
||||||
},
|
},
|
||||||
|
updatingSharedContent: {
|
||||||
|
id: 'app.action-bar.install.updating-shared-content',
|
||||||
|
defaultMessage: 'Updating shared content',
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const phaseMessages = defineMessages({
|
const phaseMessages = defineMessages({
|
||||||
@@ -268,6 +272,9 @@ export async function useInstallJobNotifications(opts: {
|
|||||||
version: job.details.major_version,
|
version: job.details.major_version,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
if (job.kind === 'update_shared_instance' && job.phase === 'downloading_content') {
|
||||||
|
return formatMessage(messages.updatingSharedContent)
|
||||||
|
}
|
||||||
return formatMessage(phaseMessages[job.phase])
|
return formatMessage(phaseMessages[job.phase])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,14 +27,14 @@ interface BrowseServerInstance {
|
|||||||
interface ContextMenuHandle {
|
interface ContextMenuHandle {
|
||||||
showMenu: (
|
showMenu: (
|
||||||
event: MouseEvent,
|
event: MouseEvent,
|
||||||
result: Labrinth.Search.v2.ResultSearchProject | Labrinth.Search.v3.ResultSearchProject,
|
result: Labrinth.Search.v3.ResultSearchProject,
|
||||||
options: { name: string }[],
|
options: { name: string }[],
|
||||||
) => void
|
) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ContextMenuOptionClick {
|
interface ContextMenuOptionClick {
|
||||||
option: 'open_link' | 'copy_link'
|
option: 'open_link' | 'copy_link'
|
||||||
item: Labrinth.Search.v2.ResultSearchProject | Labrinth.Search.v3.ResultSearchProject
|
item: Labrinth.Search.v3.ResultSearchProject
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UseAppServerBrowseOptions {
|
export interface UseAppServerBrowseOptions {
|
||||||
@@ -263,10 +263,7 @@ export function useAppServerBrowse(options: UseAppServerBrowseOptions) {
|
|||||||
return actions
|
return actions
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleRightClick(
|
function handleRightClick(event: MouseEvent, result: Labrinth.Search.v3.ResultSearchProject) {
|
||||||
event: MouseEvent,
|
|
||||||
result: Labrinth.Search.v2.ResultSearchProject | Labrinth.Search.v3.ResultSearchProject,
|
|
||||||
) {
|
|
||||||
contextMenuRef.value?.showMenu(event, result, [{ name: 'open_link' }, { name: 'copy_link' }])
|
contextMenuRef.value?.showMenu(event, result, [{ name: 'open_link' }, { name: 'copy_link' }])
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,9 +312,7 @@ export function useAppServerBrowse(options: UseAppServerBrowseOptions) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getProjectUrl(
|
function getProjectUrl(item: Labrinth.Search.v3.ResultSearchProject) {
|
||||||
item: Labrinth.Search.v2.ResultSearchProject | Labrinth.Search.v3.ResultSearchProject,
|
const projectType = item.project_types?.[0]
|
||||||
) {
|
|
||||||
const projectType = 'project_types' in item ? item.project_types?.[0] : item.project_type
|
|
||||||
return `https://modrinth.com/${projectType ?? 'project'}/${item.slug ?? item.project_id}`
|
return `https://modrinth.com/${projectType ?? 'project'}/${item.slug ?? item.project_id}`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,124 @@
|
|||||||
|
import { type ContentActionWarning, type ContentItem, defineMessages, useVIntl } from '@modrinth/ui'
|
||||||
|
import { computed, type Ref } from 'vue'
|
||||||
|
|
||||||
|
import type { GameInstance } from '@/helpers/types'
|
||||||
|
|
||||||
|
const managedSourceKinds = new Set(['shared_instance', 'modrinth_modpack', 'imported_modpack'])
|
||||||
|
|
||||||
|
export function useManagedContentPolicy(instance: Ref<GameInstance>) {
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const isManagedModpack = computed(() => instance.value.shared_instance?.role === 'member')
|
||||||
|
const isQuarantined = computed(() => instance.value.quarantined)
|
||||||
|
const canUnpublish = computed(() => instance.value.shared_instance?.role === 'owner')
|
||||||
|
const canUnlink = computed(() => instance.value.shared_instance?.role === 'member')
|
||||||
|
const managedModpackWarning = computed(() => ({
|
||||||
|
admonitionHeader: formatMessage(messages.warningHeader),
|
||||||
|
changeVersionBody: formatMessage(messages.changeVersionBody),
|
||||||
|
unlinkBody: formatMessage(messages.unlinkBody),
|
||||||
|
}))
|
||||||
|
|
||||||
|
function isManagedContent(item: ContentItem) {
|
||||||
|
return (
|
||||||
|
isQuarantined.value ||
|
||||||
|
(isManagedModpack.value && !!item.source_kind && managedSourceKinds.has(item.source_kind))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function canMutateContent(item: ContentItem) {
|
||||||
|
return !isManagedContent(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
function canUpdateContent(item: ContentItem) {
|
||||||
|
return (
|
||||||
|
canMutateContent(item) && !!item.file_path && !!item.has_update && !!item.update_version_id
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteWarning(items: ContentItem[]): ContentActionWarning | null {
|
||||||
|
if (!items.some(isManagedContent)) return null
|
||||||
|
return {
|
||||||
|
admonitionHeader: formatMessage(messages.warningHeader),
|
||||||
|
admonitionBody: formatMessage(
|
||||||
|
items.length === 1 ? messages.deleteSingleBody : messages.deleteBulkBody,
|
||||||
|
),
|
||||||
|
actionLabel: formatMessage(
|
||||||
|
items.length === 1 ? messages.deleteButton : messages.deleteManyButton,
|
||||||
|
{ count: items.length },
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function disableWarning(items: ContentItem[]): ContentActionWarning | null {
|
||||||
|
if (!items.some(isManagedContent)) return null
|
||||||
|
return {
|
||||||
|
admonitionHeader: formatMessage(messages.warningHeader),
|
||||||
|
admonitionBody: formatMessage(
|
||||||
|
items.length === 1 ? messages.disableSingleBody : messages.disableBulkBody,
|
||||||
|
),
|
||||||
|
actionLabel: formatMessage(
|
||||||
|
items.length === 1 ? messages.disableButton : messages.disableManyButton,
|
||||||
|
{ count: items.length },
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
isManagedModpack,
|
||||||
|
isQuarantined,
|
||||||
|
canUnpublish,
|
||||||
|
canUnlink,
|
||||||
|
managedModpackWarning,
|
||||||
|
isManagedContent,
|
||||||
|
canMutateContent,
|
||||||
|
canUpdateContent,
|
||||||
|
deleteWarning,
|
||||||
|
disableWarning,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const messages = defineMessages({
|
||||||
|
warningHeader: {
|
||||||
|
id: 'content.shared-instance.warning-header',
|
||||||
|
defaultMessage: 'This is part of the shared instance',
|
||||||
|
},
|
||||||
|
changeVersionBody: {
|
||||||
|
id: 'content.shared-instance.change-version-body',
|
||||||
|
defaultMessage:
|
||||||
|
'Changing the version only changes your local copy. Future shared instance updates may restore or change it again.',
|
||||||
|
},
|
||||||
|
unlinkBody: {
|
||||||
|
id: 'content.shared-instance.unlink-body',
|
||||||
|
defaultMessage:
|
||||||
|
'Unlinking only changes your local copy. Future shared instance updates may restore or change it again.',
|
||||||
|
},
|
||||||
|
deleteSingleBody: {
|
||||||
|
id: 'content.shared-instance.delete-single-body',
|
||||||
|
defaultMessage:
|
||||||
|
'Deleting it only changes your local copy. Future shared instance updates may restore or change it again.',
|
||||||
|
},
|
||||||
|
deleteBulkBody: {
|
||||||
|
id: 'content.shared-instance.delete-bulk-body',
|
||||||
|
defaultMessage:
|
||||||
|
'Some selected projects are part of the shared instance. Deleting them only changes your local copy, and future shared instance updates may restore or change them again.',
|
||||||
|
},
|
||||||
|
deleteButton: { id: 'content.shared-instance.delete-button', defaultMessage: 'Delete anyway' },
|
||||||
|
deleteManyButton: {
|
||||||
|
id: 'content.shared-instance.delete-many-button',
|
||||||
|
defaultMessage: 'Delete {count, number} projects anyway',
|
||||||
|
},
|
||||||
|
disableSingleBody: {
|
||||||
|
id: 'content.shared-instance.disable-single-body',
|
||||||
|
defaultMessage:
|
||||||
|
'Disabling it only changes your local copy. Future shared instance updates may re-enable, restore, or change it again.',
|
||||||
|
},
|
||||||
|
disableBulkBody: {
|
||||||
|
id: 'content.shared-instance.disable-bulk-body',
|
||||||
|
defaultMessage:
|
||||||
|
'Some selected projects are part of the shared instance. Disabling them only changes your local copy, and future shared instance updates may re-enable, restore, or change them again.',
|
||||||
|
},
|
||||||
|
disableButton: { id: 'content.shared-instance.disable-button', defaultMessage: 'Disable anyway' },
|
||||||
|
disableManyButton: {
|
||||||
|
id: 'content.shared-instance.disable-many-button',
|
||||||
|
defaultMessage: 'Disable {count, number} projects anyway',
|
||||||
|
},
|
||||||
|
})
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
import { useMutation, useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||||
|
import { computed, type MaybeRefOrGetter, onUnmounted, toValue } from 'vue'
|
||||||
|
|
||||||
|
import { toError } from '@/helpers/errors'
|
||||||
|
import { friend_listener } from '@/helpers/events.js'
|
||||||
|
import {
|
||||||
|
acceptCachedFriend,
|
||||||
|
add_friend,
|
||||||
|
createPendingFriend,
|
||||||
|
type FriendCacheUser,
|
||||||
|
friendsQueryKey,
|
||||||
|
type FriendWithUserData,
|
||||||
|
getFriendsWithUserData,
|
||||||
|
getFriendUserId,
|
||||||
|
matchesFriend,
|
||||||
|
remove_friend,
|
||||||
|
removeCachedFriend,
|
||||||
|
upsertCachedFriend,
|
||||||
|
} from '@/helpers/friends'
|
||||||
|
import type { ModrinthCredentials } from '@/helpers/mr_auth'
|
||||||
|
|
||||||
|
type FriendsMutationContext = {
|
||||||
|
queryKey: ReturnType<typeof friendsQueryKey>
|
||||||
|
previousFriends?: FriendWithUserData[]
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddFriendMutationVariables = {
|
||||||
|
userId: string
|
||||||
|
user: FriendCacheUser
|
||||||
|
acceptExisting: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoveFriendMutationVariables = {
|
||||||
|
userId: string
|
||||||
|
user: FriendWithUserData
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useFriends(options: {
|
||||||
|
currentUserId: MaybeRefOrGetter<string | null | undefined>
|
||||||
|
getCredentials: () => ModrinthCredentials | null | Promise<ModrinthCredentials | null>
|
||||||
|
enabled?: MaybeRefOrGetter<boolean>
|
||||||
|
onError?: (error: Error) => void
|
||||||
|
}) {
|
||||||
|
const queryClient = useQueryClient()
|
||||||
|
const queryKey = computed(() => friendsQueryKey(toValue(options.currentUserId)))
|
||||||
|
const query = useQuery({
|
||||||
|
queryKey,
|
||||||
|
queryFn: async () => getFriendsWithUserData(await options.getCredentials()),
|
||||||
|
enabled: () => !!toValue(options.currentUserId) && toValue(options.enabled ?? true),
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
const friends = computed(() => query.data.value ?? [])
|
||||||
|
|
||||||
|
function restore(context?: FriendsMutationContext) {
|
||||||
|
if (!context) return
|
||||||
|
if (context.previousFriends === undefined) {
|
||||||
|
queryClient.removeQueries({ queryKey: context.queryKey, exact: true })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
queryClient.setQueryData(context.queryKey, context.previousFriends)
|
||||||
|
}
|
||||||
|
|
||||||
|
const addMutation = useMutation({
|
||||||
|
mutationFn: ({ userId }: AddFriendMutationVariables) => add_friend(userId),
|
||||||
|
onMutate: async ({ user, acceptExisting }): Promise<FriendsMutationContext> => {
|
||||||
|
const activeQueryKey = queryKey.value
|
||||||
|
await queryClient.cancelQueries({ queryKey: activeQueryKey })
|
||||||
|
const previousFriends = queryClient.getQueryData<FriendWithUserData[]>(activeQueryKey)
|
||||||
|
const currentUserId = toValue(options.currentUserId)
|
||||||
|
queryClient.setQueryData<FriendWithUserData[]>(activeQueryKey, (cachedFriends = []) =>
|
||||||
|
acceptExisting
|
||||||
|
? acceptCachedFriend(cachedFriends, user.id, user.username, currentUserId)
|
||||||
|
: upsertCachedFriend(
|
||||||
|
cachedFriends,
|
||||||
|
createPendingFriend(user, currentUserId),
|
||||||
|
currentUserId,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
return { queryKey: activeQueryKey, previousFriends }
|
||||||
|
},
|
||||||
|
onError: (error, _variables, context) => {
|
||||||
|
restore(context)
|
||||||
|
options.onError?.(toError(error))
|
||||||
|
},
|
||||||
|
onSettled: (_data, _error, _variables, context) => {
|
||||||
|
void queryClient.invalidateQueries({ queryKey: context?.queryKey ?? queryKey.value })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
const removeMutation = useMutation({
|
||||||
|
mutationFn: ({ userId }: RemoveFriendMutationVariables) => remove_friend(userId),
|
||||||
|
onMutate: async ({ user, userId }): Promise<FriendsMutationContext> => {
|
||||||
|
const activeQueryKey = queryKey.value
|
||||||
|
await queryClient.cancelQueries({ queryKey: activeQueryKey })
|
||||||
|
const previousFriends = queryClient.getQueryData<FriendWithUserData[]>(activeQueryKey)
|
||||||
|
queryClient.setQueryData<FriendWithUserData[]>(activeQueryKey, (cachedFriends = []) =>
|
||||||
|
removeCachedFriend(cachedFriends, userId, user.username, toValue(options.currentUserId)),
|
||||||
|
)
|
||||||
|
return { queryKey: activeQueryKey, previousFriends }
|
||||||
|
},
|
||||||
|
onError: (error, _variables, context) => {
|
||||||
|
restore(context)
|
||||||
|
options.onError?.(toError(error))
|
||||||
|
},
|
||||||
|
onSettled: (_data, _error, _variables, context) => {
|
||||||
|
void queryClient.invalidateQueries({ queryKey: context?.queryKey ?? queryKey.value })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
function requestFriend(user: FriendCacheUser, acceptExisting = false) {
|
||||||
|
addMutation.mutate({ userId: user.id, user, acceptExisting })
|
||||||
|
}
|
||||||
|
|
||||||
|
function acceptFriend(friend: FriendWithUserData) {
|
||||||
|
const userId = getFriendUserId(friend, toValue(options.currentUserId))
|
||||||
|
requestFriend({ id: userId, username: friend.username, avatarUrl: friend.avatar }, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeFriend(friend: FriendWithUserData) {
|
||||||
|
const userId = getFriendUserId(friend, toValue(options.currentUserId))
|
||||||
|
removeMutation.mutate({ userId, user: friend })
|
||||||
|
}
|
||||||
|
|
||||||
|
function findFriend(id: string, username: string) {
|
||||||
|
return friends.value.find((friend) =>
|
||||||
|
matchesFriend(friend, id, username, toValue(options.currentUserId)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
let unlisten: (() => void) | undefined
|
||||||
|
void friend_listener(() => {
|
||||||
|
void queryClient.invalidateQueries({ queryKey: queryKey.value })
|
||||||
|
}).then((listener) => {
|
||||||
|
unlisten = listener
|
||||||
|
})
|
||||||
|
onUnmounted(() => unlisten?.())
|
||||||
|
|
||||||
|
return {
|
||||||
|
query,
|
||||||
|
queryKey,
|
||||||
|
friends,
|
||||||
|
loading: computed(() => !!toValue(options.currentUserId) && query.isLoading.value),
|
||||||
|
requestFriend,
|
||||||
|
acceptFriend,
|
||||||
|
removeFriend,
|
||||||
|
findFriend,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
import { useQuery } from '@tanstack/vue-query'
|
||||||
|
import { computed, type Ref } from 'vue'
|
||||||
|
|
||||||
|
import { get_user } from '@/helpers/cache.js'
|
||||||
|
|
||||||
|
export function useUserQuery(userId: Ref<string | null | undefined>) {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: computed(() => ['user', userId.value]),
|
||||||
|
queryFn: async ({ queryKey }) => {
|
||||||
|
const id = queryKey[1]
|
||||||
|
if (typeof id !== 'string') return null
|
||||||
|
return await get_user(id, 'bypass').catch(() => null)
|
||||||
|
},
|
||||||
|
enabled: () => !!userId.value,
|
||||||
|
staleTime: 30_000,
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -7,6 +7,9 @@ const labrinthBaseUrl = trimTrailingSlash(
|
|||||||
const archonBaseUrl = trimTrailingSlash(
|
const archonBaseUrl = trimTrailingSlash(
|
||||||
import.meta.env.MODRINTH_ARCHON_BASE_URL || 'https://archon.modrinth.com',
|
import.meta.env.MODRINTH_ARCHON_BASE_URL || 'https://archon.modrinth.com',
|
||||||
)
|
)
|
||||||
|
const sharedInstancesBaseUrl = trimTrailingSlash(
|
||||||
|
import.meta.env.SHARED_INSTANCES_API_BASE_URL || 'https://shared-instances.modrinth.com',
|
||||||
|
)
|
||||||
|
|
||||||
export const config = {
|
export const config = {
|
||||||
siteUrl,
|
siteUrl,
|
||||||
@@ -15,4 +18,5 @@ export const config = {
|
|||||||
'pk_test_51JbFxJJygY5LJFfKV50mnXzz3YLvBVe2Gd1jn7ljWAkaBlRz3VQdxN9mXcPSrFbSqxwAb0svte9yhnsmm7qHfcWn00R611Ce7b',
|
'pk_test_51JbFxJJygY5LJFfKV50mnXzz3YLvBVe2Gd1jn7ljWAkaBlRz3VQdxN9mXcPSrFbSqxwAb0svte9yhnsmm7qHfcWn00R611Ce7b',
|
||||||
labrinthBaseUrl,
|
labrinthBaseUrl,
|
||||||
archonBaseUrl,
|
archonBaseUrl,
|
||||||
|
sharedInstancesBaseUrl,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { invoke } from '@tauri-apps/api/core'
|
import { invoke } from '@tauri-apps/api/core'
|
||||||
|
import { listen } from '@tauri-apps/api/event'
|
||||||
|
|
||||||
export async function init_ads_window(overrideShown = false) {
|
export async function init_ads_window(overrideShown = false) {
|
||||||
return await invoke('plugin:ads|init_ads_window', {
|
return await invoke('plugin:ads|init_ads_window', {
|
||||||
@@ -15,6 +16,22 @@ export async function hide_ads_window(reset) {
|
|||||||
return await invoke('plugin:ads|hide_ads_window', { reset })
|
return await invoke('plugin:ads|hide_ads_window', { reset })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function should_show_ads_consent_popup() {
|
||||||
|
return await invoke('plugin:ads|should_show_ads_consent_popup')
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function perform_ads_consent_action(action) {
|
||||||
|
return await invoke('plugin:ads|perform_ads_consent_action', { action })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function open_ads_consent_preferences() {
|
||||||
|
return await invoke('plugin:ads|open_ads_consent_preferences')
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function ads_consent_listener(callback) {
|
||||||
|
return await listen('ads-consent-required', (event) => callback(event.payload))
|
||||||
|
}
|
||||||
|
|
||||||
export async function record_ads_click() {
|
export async function record_ads_click() {
|
||||||
return await invoke('plugin:ads|record_ads_click')
|
return await invoke('plugin:ads|record_ads_click')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
export function toError(error: unknown) {
|
||||||
|
if (error instanceof Error) return error
|
||||||
|
if (typeof error === 'string') return new Error(error)
|
||||||
|
if (error && typeof error === 'object') {
|
||||||
|
const record = error as Record<string, unknown>
|
||||||
|
const message = record.message ?? record.error
|
||||||
|
if (typeof message === 'string') return new Error(message)
|
||||||
|
return new Error(JSON.stringify(error))
|
||||||
|
}
|
||||||
|
return new Error(String(error))
|
||||||
|
}
|
||||||
@@ -6,6 +6,8 @@ import dayjs from 'dayjs'
|
|||||||
import { get_user_many } from '@/helpers/cache'
|
import { get_user_many } from '@/helpers/cache'
|
||||||
import type { ModrinthCredentials } from '@/helpers/mr_auth'
|
import type { ModrinthCredentials } from '@/helpers/mr_auth'
|
||||||
|
|
||||||
|
export const friendsQueryKey = (userId?: string | null) => ['friends', userId ?? null] as const
|
||||||
|
|
||||||
export type UserStatus = {
|
export type UserStatus = {
|
||||||
user_id: string
|
user_id: string
|
||||||
instance_name: string | null
|
instance_name: string | null
|
||||||
@@ -46,6 +48,111 @@ export type FriendWithUserData = {
|
|||||||
online: boolean
|
online: boolean
|
||||||
avatar: string
|
avatar: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type FriendCacheUser = {
|
||||||
|
id: string
|
||||||
|
username: string
|
||||||
|
avatarUrl?: string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getFriendsWithUserData(
|
||||||
|
credentials: ModrinthCredentials | null,
|
||||||
|
): Promise<FriendWithUserData[]> {
|
||||||
|
if (!credentials) return []
|
||||||
|
|
||||||
|
const friendsList = await friends()
|
||||||
|
return await transformFriends(friendsList, credentials)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createPendingFriend(
|
||||||
|
user: FriendCacheUser,
|
||||||
|
currentUserId?: string | null,
|
||||||
|
): FriendWithUserData {
|
||||||
|
return {
|
||||||
|
id: user.id,
|
||||||
|
friend_id: currentUserId ?? null,
|
||||||
|
status: null,
|
||||||
|
last_updated: null,
|
||||||
|
created: dayjs(),
|
||||||
|
username: user.username,
|
||||||
|
accepted: false,
|
||||||
|
online: false,
|
||||||
|
avatar: user.avatarUrl ?? '',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getFriendUserId(
|
||||||
|
friend: Pick<FriendWithUserData, 'id' | 'friend_id'>,
|
||||||
|
currentUserId?: string | null,
|
||||||
|
) {
|
||||||
|
return friend.id === currentUserId && friend.friend_id ? friend.friend_id : friend.id
|
||||||
|
}
|
||||||
|
|
||||||
|
export function matchesFriend(
|
||||||
|
friend: FriendWithUserData,
|
||||||
|
id: string,
|
||||||
|
username: string,
|
||||||
|
currentUserId?: string | null,
|
||||||
|
) {
|
||||||
|
const friendId = getFriendUserId(friend, currentUserId)
|
||||||
|
return (
|
||||||
|
normalizeFriendKey(friendId) === normalizeFriendKey(id) ||
|
||||||
|
normalizeFriendKey(friend.username) === normalizeFriendKey(username)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function upsertCachedFriend(
|
||||||
|
friends: FriendWithUserData[],
|
||||||
|
friend: FriendWithUserData,
|
||||||
|
currentUserId?: string | null,
|
||||||
|
) {
|
||||||
|
const existingFriend = friends.find((cachedFriend) =>
|
||||||
|
matchesFriend(cachedFriend, friend.id, friend.username, currentUserId),
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!existingFriend) return [friend, ...friends]
|
||||||
|
|
||||||
|
return friends.map((cachedFriend) =>
|
||||||
|
matchesFriend(cachedFriend, friend.id, friend.username, currentUserId)
|
||||||
|
? {
|
||||||
|
...cachedFriend,
|
||||||
|
...friend,
|
||||||
|
id: cachedFriend.id,
|
||||||
|
friend_id: cachedFriend.friend_id,
|
||||||
|
}
|
||||||
|
: cachedFriend,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function acceptCachedFriend(
|
||||||
|
friends: FriendWithUserData[],
|
||||||
|
id: string,
|
||||||
|
username: string,
|
||||||
|
currentUserId?: string | null,
|
||||||
|
) {
|
||||||
|
return friends.map((friend) =>
|
||||||
|
matchesFriend(friend, id, username, currentUserId)
|
||||||
|
? {
|
||||||
|
...friend,
|
||||||
|
accepted: true,
|
||||||
|
}
|
||||||
|
: friend,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function removeCachedFriend(
|
||||||
|
friends: FriendWithUserData[],
|
||||||
|
id: string,
|
||||||
|
username: string,
|
||||||
|
currentUserId?: string | null,
|
||||||
|
) {
|
||||||
|
return friends.filter((friend) => !matchesFriend(friend, id, username, currentUserId))
|
||||||
|
}
|
||||||
|
|
||||||
|
export function normalizeFriendKey(value: string) {
|
||||||
|
return value.trim().toLowerCase()
|
||||||
|
}
|
||||||
|
|
||||||
export async function transformFriends(
|
export async function transformFriends(
|
||||||
friends: UserFriend[],
|
friends: UserFriend[],
|
||||||
credentials: ModrinthCredentials | null,
|
credentials: ModrinthCredentials | null,
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export interface InstallModpackPreview {
|
|||||||
iconUrl?: string | null
|
iconUrl?: string | null
|
||||||
link?: InstanceLink | null
|
link?: InstanceLink | null
|
||||||
unknownFile: boolean
|
unknownFile: boolean
|
||||||
|
externalFilesInModpack: string[]
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface InstallCreateInstanceRequest {
|
export interface InstallCreateInstanceRequest {
|
||||||
@@ -44,6 +45,92 @@ export interface InstallPostInstallEdit {
|
|||||||
link?: InstanceLink | null
|
link?: InstanceLink | null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface SharedInstanceInstallPreview {
|
||||||
|
sharedInstanceId: string
|
||||||
|
version: number
|
||||||
|
name: string
|
||||||
|
iconUrl?: string | null
|
||||||
|
gameVersion: string
|
||||||
|
loader: InstanceLoader
|
||||||
|
modCount: number
|
||||||
|
externalFileCount: number
|
||||||
|
modpackVersionId?: string | null
|
||||||
|
contentVersionIds: string[]
|
||||||
|
externalFiles: SharedInstanceExternalFilePreview[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SharedInstanceInviteInstallPreview {
|
||||||
|
sharedInstanceId: string
|
||||||
|
managerId?: string | null
|
||||||
|
serverManagerName?: string | null
|
||||||
|
serverManagerIconUrl?: string | null
|
||||||
|
instanceIconUrl?: string | null
|
||||||
|
preview: SharedInstanceInstallPreview
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SharedInstanceExternalFilePreview {
|
||||||
|
fileName: string
|
||||||
|
fileType: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SharedInstanceUpdatePreview {
|
||||||
|
sharedInstanceId: string
|
||||||
|
currentVersion?: number | null
|
||||||
|
latestVersion: number
|
||||||
|
updateAvailable: boolean
|
||||||
|
diffs: SharedInstanceUpdateDiff[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SharedInstanceUpdateDiff {
|
||||||
|
type:
|
||||||
|
| 'added'
|
||||||
|
| 'removed'
|
||||||
|
| 'updated'
|
||||||
|
| 'modpack_linked'
|
||||||
|
| 'modpack_updated'
|
||||||
|
| 'modpack_unlinked'
|
||||||
|
| 'game_version_updated'
|
||||||
|
| 'loader_updated'
|
||||||
|
| 'config_files_updated'
|
||||||
|
projectId?: string | null
|
||||||
|
projectName?: string | null
|
||||||
|
fileName?: string | null
|
||||||
|
currentVersionName?: string | null
|
||||||
|
newVersionName?: string | null
|
||||||
|
configFileCount?: number | null
|
||||||
|
disabled?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SHARED_INSTANCE_UNAVAILABLE_ERROR_CODE = 'shared_instance_unavailable'
|
||||||
|
|
||||||
|
export type SharedInstanceUnavailableReason = 'deleted' | 'access_revoked' | 'quarantined'
|
||||||
|
|
||||||
|
function isRecord(value: unknown): value is Record<string, unknown> {
|
||||||
|
return typeof value === 'object' && value !== null
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isSharedInstanceUnavailableError(error: unknown) {
|
||||||
|
return getSharedInstanceUnavailableReason(error) !== null
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSharedInstanceUnavailableReason(
|
||||||
|
error: unknown,
|
||||||
|
): SharedInstanceUnavailableReason | null {
|
||||||
|
if (!isRecord(error) || error.code !== SHARED_INSTANCE_UNAVAILABLE_ERROR_CODE) return null
|
||||||
|
return error.reason === 'deleted' ||
|
||||||
|
error.reason === 'access_revoked' ||
|
||||||
|
error.reason === 'quarantined'
|
||||||
|
? error.reason
|
||||||
|
: null
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getErrorMessage(error: unknown): string {
|
||||||
|
if (typeof error === 'string') return error
|
||||||
|
if (error instanceof Error) return error.message || 'Unknown error'
|
||||||
|
if (isRecord(error) && typeof error.message === 'string') return error.message
|
||||||
|
return 'Unknown error'
|
||||||
|
}
|
||||||
|
|
||||||
export type InstallJobStatus =
|
export type InstallJobStatus =
|
||||||
| 'queued'
|
| 'queued'
|
||||||
| 'running'
|
| 'running'
|
||||||
@@ -89,6 +176,7 @@ export interface InstallErrorView {
|
|||||||
code: string
|
code: string
|
||||||
phase?: InstallPhaseId | null
|
phase?: InstallPhaseId | null
|
||||||
message: string
|
message: string
|
||||||
|
reason?: SharedInstanceUnavailableReason | null
|
||||||
api?: {
|
api?: {
|
||||||
error: string
|
error: string
|
||||||
status?: number | null
|
status?: number | null
|
||||||
@@ -121,6 +209,8 @@ export interface InstallJobSnapshot {
|
|||||||
kind:
|
kind:
|
||||||
| 'create_instance'
|
| 'create_instance'
|
||||||
| 'create_modpack_instance'
|
| 'create_modpack_instance'
|
||||||
|
| 'create_shared_instance'
|
||||||
|
| 'update_shared_instance'
|
||||||
| 'import_instance'
|
| 'import_instance'
|
||||||
| 'duplicate_instance'
|
| 'duplicate_instance'
|
||||||
| 'install_existing_instance'
|
| 'install_existing_instance'
|
||||||
@@ -171,6 +261,58 @@ export async function install_create_modpack_instance(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function install_get_shared_instance_preview(sharedInstanceId: string, name: string) {
|
||||||
|
return await invoke<SharedInstanceInstallPreview>(
|
||||||
|
'plugin:install|install_get_shared_instance_preview',
|
||||||
|
{
|
||||||
|
sharedInstanceId,
|
||||||
|
name,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function install_accept_shared_instance_invite(inviteId: string) {
|
||||||
|
return await invoke<SharedInstanceInviteInstallPreview>(
|
||||||
|
'plugin:install|install_accept_shared_instance_invite',
|
||||||
|
{
|
||||||
|
inviteId,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function install_get_shared_instance_update_preview(instanceId: string) {
|
||||||
|
return await invoke<SharedInstanceUpdatePreview | null>(
|
||||||
|
'plugin:install|install_get_shared_instance_update_preview',
|
||||||
|
{
|
||||||
|
instanceId,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function install_shared_instance(
|
||||||
|
sharedInstanceId: string,
|
||||||
|
name: string,
|
||||||
|
managerId?: string | null,
|
||||||
|
serverManagerName?: string | null,
|
||||||
|
serverManagerIconUrl?: string | null,
|
||||||
|
instanceIconUrl?: string | null,
|
||||||
|
) {
|
||||||
|
return await invoke<InstallJobSnapshot>('plugin:install|install_shared_instance', {
|
||||||
|
sharedInstanceId,
|
||||||
|
name,
|
||||||
|
managerId,
|
||||||
|
serverManagerName,
|
||||||
|
serverManagerIconUrl,
|
||||||
|
instanceIconUrl,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function install_update_shared_instance(instanceId: string) {
|
||||||
|
return await invoke<InstallJobSnapshot>('plugin:install|install_update_shared_instance', {
|
||||||
|
instanceId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export async function install_import_instance(
|
export async function install_import_instance(
|
||||||
launcherType: string,
|
launcherType: string,
|
||||||
basePath: string,
|
basePath: string,
|
||||||
@@ -248,7 +390,8 @@ export function isInstallJobFinished(status: InstallJobStatus) {
|
|||||||
function settleInstallJob(job: InstallJobSnapshot) {
|
function settleInstallJob(job: InstallJobSnapshot) {
|
||||||
if (job.status === 'succeeded') return job
|
if (job.status === 'succeeded') return job
|
||||||
|
|
||||||
throw new Error(job.error?.message ?? `Install job ${job.job_id} ${job.status}`)
|
if (job.error) throw job.error
|
||||||
|
throw new Error(`Install job ${job.job_id} ${job.status}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function wait_for_install_job(jobId: string) {
|
export async function wait_for_install_job(jobId: string) {
|
||||||
|
|||||||
@@ -7,13 +7,14 @@ import type { Labrinth } from '@modrinth/api-client'
|
|||||||
import type { ContentItem, ContentOwner } from '@modrinth/ui'
|
import type { ContentItem, ContentOwner } from '@modrinth/ui'
|
||||||
import { invoke } from '@tauri-apps/api/core'
|
import { invoke } from '@tauri-apps/api/core'
|
||||||
|
|
||||||
import type { InstallJobSnapshot } from './install'
|
import type { InstallJobSnapshot, SharedInstanceUpdateDiff } from './install'
|
||||||
import type {
|
import type {
|
||||||
CacheBehaviour,
|
CacheBehaviour,
|
||||||
ContentFile,
|
ContentFile,
|
||||||
ContentFileProjectType,
|
ContentFileProjectType,
|
||||||
GameInstance,
|
GameInstance,
|
||||||
InstanceLoader,
|
InstanceLoader,
|
||||||
|
SharedInstanceAttachment,
|
||||||
} from './types'
|
} from './types'
|
||||||
|
|
||||||
export async function remove(instanceId: string): Promise<void> {
|
export async function remove(instanceId: string): Promise<void> {
|
||||||
@@ -242,6 +243,10 @@ export async function add_project_from_path(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function is_file_on_modrinth(projectPath: string): Promise<boolean> {
|
||||||
|
return await invoke('plugin:instance|instance_is_file_on_modrinth', { projectPath })
|
||||||
|
}
|
||||||
|
|
||||||
// Toggle disabling a project
|
// Toggle disabling a project
|
||||||
export async function toggle_disable_project(
|
export async function toggle_disable_project(
|
||||||
instanceId: string,
|
instanceId: string,
|
||||||
@@ -331,3 +336,93 @@ export async function edit(instanceId: string, editInstance: Partial<GameInstanc
|
|||||||
export async function edit_icon(instanceId: string, iconPath: string | null): Promise<void> {
|
export async function edit_icon(instanceId: string, iconPath: string | null): Promise<void> {
|
||||||
return await invoke('plugin:instance|instance_edit_icon', { instanceId, iconPath })
|
return await invoke('plugin:instance|instance_edit_icon', { instanceId, iconPath })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type SharedInstanceUsers = {
|
||||||
|
user_ids: string[]
|
||||||
|
users: SharedInstanceUser[]
|
||||||
|
tokens: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export type SharedInstanceJoinType = 'owner' | 'invite' | 'link'
|
||||||
|
|
||||||
|
export type SharedInstanceUser = {
|
||||||
|
id: string
|
||||||
|
joined_at?: string | null
|
||||||
|
join_type: SharedInstanceJoinType
|
||||||
|
last_played?: string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SharedInstancePublishPreview {
|
||||||
|
sharedInstanceId: string
|
||||||
|
latestVersion: number
|
||||||
|
diffs: SharedInstanceUpdateDiff[]
|
||||||
|
configFiles: string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SharedInstanceInviteLink {
|
||||||
|
inviteId: string
|
||||||
|
expiresAt: string
|
||||||
|
maxUses: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function can_current_user_use_shared_instances(): Promise<boolean> {
|
||||||
|
return await invoke('plugin:instance|instance_share_can_current_user_use')
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function get_shared_instance_users(instanceId: string): Promise<SharedInstanceUsers> {
|
||||||
|
return await invoke('plugin:instance|instance_share_get_users', { instanceId })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function invite_shared_instance_users(
|
||||||
|
instanceId: string,
|
||||||
|
userIds: string[],
|
||||||
|
): Promise<SharedInstanceUsers> {
|
||||||
|
return await invoke('plugin:instance|instance_share_invite_users', { instanceId, userIds })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function create_shared_instance_invite_link(
|
||||||
|
instanceId: string,
|
||||||
|
options: {
|
||||||
|
maxAgeSeconds?: number
|
||||||
|
maxUses?: number
|
||||||
|
replaceInviteId?: string
|
||||||
|
} = {},
|
||||||
|
): Promise<SharedInstanceInviteLink> {
|
||||||
|
return await invoke('plugin:instance|instance_share_create_invite_link', {
|
||||||
|
instanceId,
|
||||||
|
...options,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function remove_shared_instance_users(
|
||||||
|
instanceId: string,
|
||||||
|
userIds: string[],
|
||||||
|
hasPendingRecipients: boolean,
|
||||||
|
): Promise<SharedInstanceUsers> {
|
||||||
|
return await invoke('plugin:instance|instance_share_remove_users', {
|
||||||
|
instanceId,
|
||||||
|
userIds,
|
||||||
|
hasPendingRecipients,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function get_shared_instance_publish_preview(
|
||||||
|
instanceId: string,
|
||||||
|
): Promise<SharedInstancePublishPreview | null> {
|
||||||
|
return await invoke('plugin:instance|instance_share_get_publish_preview', { instanceId })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function publish_shared_instance(
|
||||||
|
instanceId: string,
|
||||||
|
configPaths: string[],
|
||||||
|
): Promise<SharedInstanceAttachment> {
|
||||||
|
return await invoke('plugin:instance|instance_share_publish', { instanceId, configPaths })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function unlink_shared_instance(instanceId: string): Promise<void> {
|
||||||
|
return await invoke('plugin:instance|instance_share_unlink', { instanceId })
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function unpublish_shared_instance(instanceId: string): Promise<void> {
|
||||||
|
return await invoke('plugin:instance|instance_share_unpublish', { instanceId })
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,8 +12,10 @@ export type ModrinthCredentials = {
|
|||||||
active: boolean
|
active: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function login(): Promise<ModrinthCredentials> {
|
export type ModrinthAuthFlow = 'sign-in' | 'sign-up'
|
||||||
return await invoke('plugin:mr-auth|modrinth_login')
|
|
||||||
|
export async function login(flow: ModrinthAuthFlow = 'sign-in'): Promise<ModrinthCredentials> {
|
||||||
|
return await invoke('plugin:mr-auth|modrinth_login', { flow })
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function logout(): Promise<void> {
|
export async function logout(): Promise<void> {
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
import { ClassicPlayerModel, SlimPlayerModel } from '@modrinth/assets'
|
import { ClassicPlayerModel, SlimPlayerModel } from '@modrinth/assets'
|
||||||
import {
|
import {
|
||||||
applyCapeTexture,
|
applyCapeTexture,
|
||||||
|
applyEarsMod,
|
||||||
createTransparentTexture,
|
createTransparentTexture,
|
||||||
disposeCaches,
|
disposeCaches,
|
||||||
|
loadTexture,
|
||||||
|
removeEarsMod,
|
||||||
setupSkinModel,
|
setupSkinModel,
|
||||||
} from '@modrinth/ui'
|
} from '@modrinth/ui'
|
||||||
import * as THREE from 'three'
|
import * as THREE from 'three'
|
||||||
@@ -71,12 +74,13 @@ class BatchSkinRenderer {
|
|||||||
textureUrl: string,
|
textureUrl: string,
|
||||||
modelUrl: string,
|
modelUrl: string,
|
||||||
capeUrl?: string,
|
capeUrl?: string,
|
||||||
|
earsTextureUrl?: string,
|
||||||
): Promise<RawRenderResult> {
|
): Promise<RawRenderResult> {
|
||||||
this.initializeRenderer()
|
this.initializeRenderer()
|
||||||
|
|
||||||
this.clearScene()
|
this.clearScene()
|
||||||
|
|
||||||
await this.setupModel(modelUrl, textureUrl, capeUrl)
|
await this.setupModel(modelUrl, textureUrl, capeUrl, earsTextureUrl)
|
||||||
|
|
||||||
const headPart = this.currentModel!.getObjectByName('Head')
|
const headPart = this.currentModel!.getObjectByName('Head')
|
||||||
let lookAtTarget: [number, number, number]
|
let lookAtTarget: [number, number, number]
|
||||||
@@ -123,17 +127,29 @@ class BatchSkinRenderer {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private async setupModel(modelUrl: string, textureUrl: string, capeUrl?: string): Promise<void> {
|
private async setupModel(
|
||||||
|
modelUrl: string,
|
||||||
|
textureUrl: string,
|
||||||
|
capeUrl?: string,
|
||||||
|
earsTextureUrl?: string,
|
||||||
|
): Promise<void> {
|
||||||
if (!this.scene) {
|
if (!this.scene) {
|
||||||
throw new Error('Renderer not initialized')
|
throw new Error('Renderer not initialized')
|
||||||
}
|
}
|
||||||
|
|
||||||
const { model } = await setupSkinModel(modelUrl, textureUrl, capeUrl)
|
const [{ model }, earsTexture] = await Promise.all([
|
||||||
|
setupSkinModel(modelUrl, textureUrl, capeUrl),
|
||||||
|
earsTextureUrl ? loadTexture(earsTextureUrl) : Promise.resolve(null),
|
||||||
|
])
|
||||||
|
|
||||||
if (!capeUrl) {
|
if (!capeUrl) {
|
||||||
applyCapeTexture(model, null, this.getTransparentTexture())
|
applyCapeTexture(model, null, this.getTransparentTexture())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (earsTexture) {
|
||||||
|
applyEarsMod(model, earsTexture)
|
||||||
|
}
|
||||||
|
|
||||||
const group = new THREE.Group()
|
const group = new THREE.Group()
|
||||||
group.add(model)
|
group.add(model)
|
||||||
group.position.set(0, 0.3, 1.95)
|
group.position.set(0, 0.3, 1.95)
|
||||||
@@ -154,6 +170,7 @@ class BatchSkinRenderer {
|
|||||||
private clearScene(): void {
|
private clearScene(): void {
|
||||||
if (!this.scene || !this.currentModel) return
|
if (!this.scene || !this.currentModel) return
|
||||||
|
|
||||||
|
removeEarsMod(this.currentModel)
|
||||||
this.scene.remove(this.currentModel)
|
this.scene.remove(this.currentModel)
|
||||||
this.currentModel.clear()
|
this.currentModel.clear()
|
||||||
this.currentModel = null
|
this.currentModel = null
|
||||||
@@ -193,6 +210,7 @@ function getModelUrlForVariant(variant: string): string {
|
|||||||
export const skinBlobUrlMap = reactive(new Map<string, RenderResult>())
|
export const skinBlobUrlMap = reactive(new Map<string, RenderResult>())
|
||||||
export const headBlobUrlMap = reactive(new Map<string, string>())
|
export const headBlobUrlMap = reactive(new Map<string, string>())
|
||||||
const DEBUG_MODE = false
|
const DEBUG_MODE = false
|
||||||
|
const SKIN_PREVIEW_RENDER_VERSION = 'ears-2-fixed-uvs'
|
||||||
|
|
||||||
let sharedRenderer: BatchSkinRenderer | null = null
|
let sharedRenderer: BatchSkinRenderer | null = null
|
||||||
let latestPreviewGeneration = 0
|
let latestPreviewGeneration = 0
|
||||||
@@ -205,6 +223,10 @@ function getSharedRenderer(): BatchSkinRenderer {
|
|||||||
return sharedRenderer
|
return sharedRenderer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getSkinPreviewKey(skin: Skin): string {
|
||||||
|
return `${SKIN_PREVIEW_RENDER_VERSION}+${skin.texture_key}+${skin.variant}+${skin.cape_id ?? 'no-cape'}`
|
||||||
|
}
|
||||||
|
|
||||||
export function disposeSharedRenderer(): void {
|
export function disposeSharedRenderer(): void {
|
||||||
if (sharedRenderer) {
|
if (sharedRenderer) {
|
||||||
sharedRenderer.dispose()
|
sharedRenderer.dispose()
|
||||||
@@ -217,7 +239,7 @@ export async function cleanupUnusedPreviews(skins: Skin[]): Promise<void> {
|
|||||||
const validHeadKeys = new Set<string>()
|
const validHeadKeys = new Set<string>()
|
||||||
|
|
||||||
for (const skin of skins) {
|
for (const skin of skins) {
|
||||||
const key = `${skin.texture_key}+${skin.variant}+${skin.cape_id ?? 'no-cape'}`
|
const key = getSkinPreviewKey(skin)
|
||||||
const headKey = `${skin.texture_key}-head`
|
const headKey = `${skin.texture_key}-head`
|
||||||
validKeys.add(key)
|
validKeys.add(key)
|
||||||
validHeadKeys.add(headKey)
|
validHeadKeys.add(headKey)
|
||||||
@@ -382,9 +404,7 @@ async function generateSkinPreviewsForGeneration(
|
|||||||
const isCurrentGeneration = () => generation === latestPreviewGeneration
|
const isCurrentGeneration = () => generation === latestPreviewGeneration
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const skinKeys = skins.map(
|
const skinKeys = skins.map(getSkinPreviewKey)
|
||||||
(skin) => `${skin.texture_key}+${skin.variant}+${skin.cape_id ?? 'no-cape'}`,
|
|
||||||
)
|
|
||||||
const headKeys = skins.map((skin) => `${skin.texture_key}-head`)
|
const headKeys = skins.map((skin) => `${skin.texture_key}-head`)
|
||||||
|
|
||||||
const [cachedSkinPreviews, cachedHeadPreviews] = await Promise.all([
|
const [cachedSkinPreviews, cachedHeadPreviews] = await Promise.all([
|
||||||
@@ -415,7 +435,7 @@ async function generateSkinPreviewsForGeneration(
|
|||||||
for (const skin of skins) {
|
for (const skin of skins) {
|
||||||
if (!isCurrentGeneration()) return
|
if (!isCurrentGeneration()) return
|
||||||
|
|
||||||
const key = `${skin.texture_key}+${skin.variant}+${skin.cape_id ?? 'no-cape'}`
|
const key = getSkinPreviewKey(skin)
|
||||||
|
|
||||||
if (skinBlobUrlMap.has(key)) {
|
if (skinBlobUrlMap.has(key)) {
|
||||||
if (DEBUG_MODE) {
|
if (DEBUG_MODE) {
|
||||||
@@ -443,6 +463,7 @@ async function generateSkinPreviewsForGeneration(
|
|||||||
await get_normalized_skin_texture(skin),
|
await get_normalized_skin_texture(skin),
|
||||||
modelUrl,
|
modelUrl,
|
||||||
cape?.texture,
|
cape?.texture,
|
||||||
|
skin.texture,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (!isCurrentGeneration()) return
|
if (!isCurrentGeneration()) return
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { invoke } from '@tauri-apps/api/core'
|
||||||
|
|
||||||
|
export type ReportItemType = 'project' | 'version' | 'user' | 'shared-instance'
|
||||||
|
|
||||||
|
export interface CreateReportRequest {
|
||||||
|
report_type: string
|
||||||
|
item_id: string
|
||||||
|
item_type: ReportItemType
|
||||||
|
body: string
|
||||||
|
uploaded_images: string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreateReportResponse {
|
||||||
|
id: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function create_report(request: CreateReportRequest) {
|
||||||
|
return await invoke<CreateReportResponse>('plugin:reports|reports_create', { request })
|
||||||
|
}
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
import { defineMessages, injectNotificationManager, useVIntl } from '@modrinth/ui'
|
||||||
|
|
||||||
|
import { getErrorMessage, type SharedInstanceUnavailableReason } from '@/helpers/install'
|
||||||
|
|
||||||
|
export const sharedInstanceErrorMessages = defineMessages({
|
||||||
|
unavailableTitle: {
|
||||||
|
id: 'instance.shared-instance.unavailable.title',
|
||||||
|
defaultMessage: 'Shared instance no longer available',
|
||||||
|
},
|
||||||
|
lockedTitle: {
|
||||||
|
id: 'instance.shared-instance.unavailable.locked-title',
|
||||||
|
defaultMessage: 'Instance locked',
|
||||||
|
},
|
||||||
|
unavailableText: {
|
||||||
|
id: 'instance.shared-instance.unavailable.text',
|
||||||
|
defaultMessage:
|
||||||
|
"Your local instance is still available, but it is no longer linked and won't receive updates.",
|
||||||
|
},
|
||||||
|
deletedText: {
|
||||||
|
id: 'instance.shared-instance.unavailable.deleted-text',
|
||||||
|
defaultMessage:
|
||||||
|
'The primary instance was deleted. This instance is still available, but it is no longer linked and will no longer receive updates.',
|
||||||
|
},
|
||||||
|
accessRevokedText: {
|
||||||
|
id: 'instance.shared-instance.unavailable.access-revoked-text',
|
||||||
|
defaultMessage:
|
||||||
|
'Your access to the shared instance was revoked. This instance is still available, but it is no longer linked and will no longer receive updates.',
|
||||||
|
},
|
||||||
|
lockedText: {
|
||||||
|
id: 'instance.shared-instance.unavailable.locked-text',
|
||||||
|
defaultMessage:
|
||||||
|
'This shared instance was locked by the Content Moderation team. It will no longer receive updates from the primary instance and cannot be played.',
|
||||||
|
},
|
||||||
|
unavailableFallbackManager: {
|
||||||
|
id: 'instance.shared-instance.unavailable.manager-fallback',
|
||||||
|
defaultMessage: 'the instance manager',
|
||||||
|
},
|
||||||
|
errorTitle: {
|
||||||
|
id: 'instance.shared-instance.error.title',
|
||||||
|
defaultMessage: 'Something has gone wrong',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export function sharedInstanceUnavailableTextMessage(
|
||||||
|
reason: SharedInstanceUnavailableReason | null,
|
||||||
|
) {
|
||||||
|
if (reason === 'deleted') return sharedInstanceErrorMessages.deletedText
|
||||||
|
if (reason === 'access_revoked') return sharedInstanceErrorMessages.accessRevokedText
|
||||||
|
if (reason === 'quarantined') return sharedInstanceErrorMessages.lockedText
|
||||||
|
return sharedInstanceErrorMessages.unavailableText
|
||||||
|
}
|
||||||
|
|
||||||
|
export function sharedInstanceUnavailableTitleMessage(
|
||||||
|
reason: SharedInstanceUnavailableReason | null,
|
||||||
|
) {
|
||||||
|
return reason === 'quarantined'
|
||||||
|
? sharedInstanceErrorMessages.lockedTitle
|
||||||
|
: sharedInstanceErrorMessages.unavailableTitle
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useSharedInstanceErrors() {
|
||||||
|
const { formatMessage } = useVIntl()
|
||||||
|
const { addNotification } = injectNotificationManager()
|
||||||
|
|
||||||
|
function formatSharedInstanceUnavailable(
|
||||||
|
reason: SharedInstanceUnavailableReason | null = null,
|
||||||
|
manager?: string | null,
|
||||||
|
) {
|
||||||
|
return formatMessage(sharedInstanceUnavailableTextMessage(reason), {
|
||||||
|
manager: manager || formatMessage(sharedInstanceErrorMessages.unavailableFallbackManager),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function notifySharedInstanceUnavailable(
|
||||||
|
reason: SharedInstanceUnavailableReason | null = null,
|
||||||
|
manager?: string | null,
|
||||||
|
) {
|
||||||
|
addNotification({
|
||||||
|
type: 'warning',
|
||||||
|
title: formatMessage(sharedInstanceUnavailableTitleMessage(reason)),
|
||||||
|
text: formatSharedInstanceUnavailable(reason, manager),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function notifySharedInstanceError(error: unknown) {
|
||||||
|
addNotification({
|
||||||
|
type: 'error',
|
||||||
|
title: formatMessage(sharedInstanceErrorMessages.errorTitle),
|
||||||
|
text: getErrorMessage(error),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
formatSharedInstanceUnavailable,
|
||||||
|
notifySharedInstanceError,
|
||||||
|
notifySharedInstanceUnavailable,
|
||||||
|
}
|
||||||
|
}
|
||||||
+32
-1
@@ -17,6 +17,8 @@ export type GameInstance = {
|
|||||||
groups: string[]
|
groups: string[]
|
||||||
|
|
||||||
link?: InstanceLink | null
|
link?: InstanceLink | null
|
||||||
|
shared_instance?: SharedInstanceAttachment | null
|
||||||
|
quarantined: boolean
|
||||||
update_channel: ReleaseChannel
|
update_channel: ReleaseChannel
|
||||||
|
|
||||||
created: Date
|
created: Date
|
||||||
@@ -86,18 +88,47 @@ export type InstanceLink = InstanceLinkIdentity &
|
|||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
type: 'shared_instance'
|
type: 'shared_instance'
|
||||||
shared_instance_id: string
|
modpack_project_id?: ModrinthId | null
|
||||||
|
modpack_version_id?: ModrinthId | null
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
export type SharedInstanceAttachment = {
|
||||||
|
id: string
|
||||||
|
role: 'owner' | 'member'
|
||||||
|
manager_id?: string | null
|
||||||
|
server_manager_name?: string | null
|
||||||
|
server_manager_icon_url?: string | null
|
||||||
|
linked_user_id?: string | null
|
||||||
|
status:
|
||||||
|
| 'unknown'
|
||||||
|
| 'up_to_date'
|
||||||
|
| 'update_available'
|
||||||
|
| 'applying'
|
||||||
|
| 'stale'
|
||||||
|
| 'not_ready'
|
||||||
|
| 'error'
|
||||||
|
applied_version?: number | null
|
||||||
|
latest_version?: number | null
|
||||||
|
}
|
||||||
|
|
||||||
export type Instance = GameInstance
|
export type Instance = GameInstance
|
||||||
|
|
||||||
type ReleaseChannel = 'release' | 'beta' | 'alpha'
|
type ReleaseChannel = 'release' | 'beta' | 'alpha'
|
||||||
|
|
||||||
export type InstanceLoader = 'vanilla' | 'forge' | 'fabric' | 'quilt' | 'neoforge'
|
export type InstanceLoader = 'vanilla' | 'forge' | 'fabric' | 'quilt' | 'neoforge'
|
||||||
|
|
||||||
|
export type ContentSourceKind =
|
||||||
|
| 'local'
|
||||||
|
| 'modrinth_modpack'
|
||||||
|
| 'server_project'
|
||||||
|
| 'modrinth_hosting'
|
||||||
|
| 'imported_modpack'
|
||||||
|
| 'shared_instance'
|
||||||
|
|
||||||
type ContentFile = {
|
type ContentFile = {
|
||||||
enabled: boolean
|
enabled: boolean
|
||||||
|
source_kind?: ContentSourceKind | null
|
||||||
metadata?: {
|
metadata?: {
|
||||||
project_id: string
|
project_id: string
|
||||||
version_id: string
|
version_id: string
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { invoke } from '@tauri-apps/api/core'
|
||||||
|
|
||||||
|
export type SearchUser = {
|
||||||
|
id: string
|
||||||
|
username: string
|
||||||
|
avatar_url: string | null
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function search_user(query: string): Promise<SearchUser[]> {
|
||||||
|
return await invoke<SearchUser[]>('plugin:users|search_user', { query })
|
||||||
|
}
|
||||||
@@ -11,6 +11,87 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "إخفاء المزيد من الحالات قيد التشغيل"
|
"message": "إخفاء المزيد من الحالات قيد التشغيل"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "تم النسخ"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "نسخ التفاصيل"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "التجاهل"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "فتح المثيل"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "إعادة المحاولة"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "تم الإلغاء بسبب إغلاق التطبيق"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "تعذّر قراءة حزمة التعديلات"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "تم الإلغاء"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "لم تكتمل عملية التنظيف"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "تعذّر تنزيل الملفات"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "الملف الذي تم تنزيله تالف"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "تعذّر حفظ الملفات"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "لم يكتمل التنزيل"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "تعذّر العثور على المثيل"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "مسار الملف غير صالح"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "بيانات حزمة التعديلات غير صالحة"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "تحتوي ملفات حزمة التعديلات على بيانات وصفية غير صالحة"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "لم يكتمل إعداد Java"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "فشل إعداد أداة التحميل"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "تعذر تحديث البيانات المحلية"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "فشل إعداد Minecraft"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "لم أتمكن من الوصول إلى Modrinth"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "لا يوجد إذن للكتابة"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "تعذر تنزيل الحزمة"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "حدث خطأ ما"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "مثيل غير معروف"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "عمليات التثبيت"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "إنشاء نسخة أساسية"
|
"message": "إنشاء نسخة أساسية"
|
||||||
},
|
},
|
||||||
@@ -44,6 +125,15 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "عرض التسجيل"
|
"message": "عرض التسجيل"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "قبول الكل"
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "إدارة التفضيلات"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "رفض الكل"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "يتيح العرض المتقدم لتأثيرات مثل التشويش الذي قد تسبب مشكلات في الأداء دون استخدام العرض المسرع بالأجهزة."
|
"message": "يتيح العرض المتقدم لتأثيرات مثل التشويش الذي قد تسبب مشكلات في الأداء دون استخدام العرض المسرع بالأجهزة."
|
||||||
},
|
},
|
||||||
@@ -74,12 +164,63 @@
|
|||||||
"app.appearance-settings.hide-nametag.title": {
|
"app.appearance-settings.hide-nametag.title": {
|
||||||
"message": "إخفاء عرض الاسم"
|
"message": "إخفاء عرض الاسم"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.jump-back-into-worlds.description": {
|
||||||
|
"message": "يتضمن العوالم الحديثة في قسم \"العودة إلى اللعب\" على الصفحة الرئيسية."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||||
|
"message": "العودة إلى العوالم"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.minimize-launcher.description": {
|
||||||
|
"message": "قم بتصغير نافذة المشغل عند بدء تشغيل عملية Minecraft."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.minimize-launcher.title": {
|
||||||
|
"message": "تصغير نافذة المشغل"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.native-decorations.description": {
|
||||||
|
"message": "استخدام إطار نافذة النظام (يتطلب إعادة تشغيل التطبيق)."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.native-decorations.title": {
|
||||||
|
"message": "الزخارف التقليدية"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.select-option": {
|
||||||
|
"message": "حدد خياراً"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.show-play-time.description": {
|
||||||
|
"message": "يعرض مقدار الوقت الذي قضيته في لعب إحدى المهام."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.show-play-time.title": {
|
||||||
|
"message": "إظهار مدة التشغيل"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "يتخطى تلقائيًا عمليات التأكيد ذات المخاطر المنخفضة، مثل تثبيت حزم التعديلات المكررة، وحذف المحتوى العادي، والتحديثات الجماعية، وإلغاء ربط حزم التعديلات، ومطالبات الإصلاح. وسيستمر عرض التحذيرات الخطيرة."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "تخطي التحذيرات غير الضرورية"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
|
"message": "يتيح إمكانية إظهار الشريط الجانبي أو إخفائه."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.toggle-sidebar.title": {
|
||||||
|
"message": "تبديل الشريط الجانبي"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.unknown-pack-warning.description": {
|
||||||
|
"message": "إذا حاولت تثبيت ملف Modrinth Pack (.mrpack) غير مستضاف على Modrinth، فسنتأكد من أنك على دراية بالمخاطر قبل تثبيته."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.unknown-pack-warning.title": {
|
||||||
|
"message": "أخبرني قبل تثبيت حزم التعديلات غير المعروفة"
|
||||||
|
},
|
||||||
"app.auth-servers.unreachable.body": {
|
"app.auth-servers.unreachable.body": {
|
||||||
"message": "قد تكون خوادم مصادقة ماينكرافت معطلة حاليًا. تحقق من اتصالك بالإنترنت وحاول مرة أخرى لاحقًا."
|
"message": "قد تكون خوادم مصادقة ماينكرافت معطلة حاليًا. تحقق من اتصالك بالإنترنت وحاول مرة أخرى لاحقًا."
|
||||||
},
|
},
|
||||||
"app.auth-servers.unreachable.header": {
|
"app.auth-servers.unreachable.header": {
|
||||||
"message": "تعذر الوصول إلى خوادم المصادقة"
|
"message": "تعذر الوصول إلى خوادم المصادقة"
|
||||||
},
|
},
|
||||||
|
"app.browse.add-servers-to-instance": {
|
||||||
|
"message": "إضافة خادم إلى المثيل"
|
||||||
|
},
|
||||||
|
"app.browse.add-to-an-instance": {
|
||||||
|
"message": "إضافة إلى مثيل"
|
||||||
|
},
|
||||||
"app.browse.add-to-instance": {
|
"app.browse.add-to-instance": {
|
||||||
"message": "أضف للنموذج"
|
"message": "أضف للنموذج"
|
||||||
},
|
},
|
||||||
@@ -102,11 +243,20 @@
|
|||||||
"message": "استكشف خوادم"
|
"message": "استكشف خوادم"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "إخفاء الخوادم المضافة مسبقًا"
|
"message": "إخفاء الخوادم التي تمت إضافتها بالفعل"
|
||||||
|
},
|
||||||
|
"app.browse.project-type.modpacks": {
|
||||||
|
"message": "حزم التعديل"
|
||||||
|
},
|
||||||
|
"app.browse.server-instance-content-warning": {
|
||||||
|
"message": "قد تؤدي إضافة المحتوى إلى حدوث مشاكل في التوافق عند الاتصال بالخادم. كما سيُفقد أي محتوى تمت إضافته عند تحديث محتوى مثيل الخادم."
|
||||||
},
|
},
|
||||||
"app.browse.server.installing": {
|
"app.browse.server.installing": {
|
||||||
"message": "جاري التثبيت"
|
"message": "جاري التثبيت"
|
||||||
},
|
},
|
||||||
|
"app.content-install.no-compatible-versions": {
|
||||||
|
"message": "لا توجد إصدارات متاحة تتوافق مع {compatibilityLabel}. اختر إصدارًا لتثبيته على أي حال. لن يتم تثبيت التبعيات تلقائيًا."
|
||||||
|
},
|
||||||
"app.export-modal.description-placeholder": {
|
"app.export-modal.description-placeholder": {
|
||||||
"message": "أدخل وصف التعديل..."
|
"message": "أدخل وصف التعديل..."
|
||||||
},
|
},
|
||||||
@@ -128,6 +278,60 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.downloading_content": {
|
||||||
|
"message": "تنزيل المحتوى"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_minecraft": {
|
||||||
|
"message": "تنزيل لعبة Minecraft"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_pack_file": {
|
||||||
|
"message": "تنزيل ملف الحزمة"
|
||||||
|
},
|
||||||
|
"app.install.phase.extracting_overrides": {
|
||||||
|
"message": "استخراج التجاوزات"
|
||||||
|
},
|
||||||
|
"app.install.phase.finalizing": {
|
||||||
|
"message": "وضع اللمسات الأخيرة"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_instance": {
|
||||||
|
"message": "في قائمة الانتظار للتثبيت"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java": {
|
||||||
|
"message": "التحضير لـ Java"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "تنزيل Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "استخراج Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "جلب Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.resolving": {
|
||||||
|
"message": "التحضير لـ Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "التحقق من صحة إصدار Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "قراءة قائمة المحتويات"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_loader": {
|
||||||
|
"message": "معالج التحميل"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_minecraft": {
|
||||||
|
"message": "حل مشكلة Minecraft"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_pack": {
|
||||||
|
"message": "معالجة المحتوى"
|
||||||
|
},
|
||||||
|
"app.install.phase.rolling_back": {
|
||||||
|
"message": "التراجع"
|
||||||
|
},
|
||||||
|
"app.install.phase.running_loader_processors": {
|
||||||
|
"message": "تشغيل معالجات التحميل"
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "سيتم حذف جميع البيانات الخاصة لنموذجك نهائيًا، بما في ذلك عوالمك والتكوينات وكل المحتوى المثبت."
|
"message": "سيتم حذف جميع البيانات الخاصة لنموذجك نهائيًا، بما في ذلك عوالمك والتكوينات وكل المحتوى المثبت."
|
||||||
},
|
},
|
||||||
@@ -152,6 +356,15 @@
|
|||||||
"app.instance.modpack-already-installed.instance": {
|
"app.instance.modpack-already-installed.instance": {
|
||||||
"message": "النموذج"
|
"message": "النموذج"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "جاري تنزيل {current, number}/{total, number} مشروعًا..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
|
"message": "آخر المستجدات حول عملية التشطيب..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.resolving-versions": {
|
||||||
|
"message": "تحديد الإصدارات..."
|
||||||
|
},
|
||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "مشروع"
|
"message": "مشروع"
|
||||||
},
|
},
|
||||||
@@ -176,6 +389,18 @@
|
|||||||
"app.instance.worlds.browse-servers": {
|
"app.instance.worlds.browse-servers": {
|
||||||
"message": "تصفح الخوادم"
|
"message": "تصفح الخوادم"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.delete-button": {
|
||||||
|
"message": "حذف العالم"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.title": {
|
||||||
|
"message": "حذف العالم"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
|
"message": "سيتم حذف هذا العالم نهائيًا من هذه النسخة. لا يمكن التراجع عن هذا الإجراء."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
|
"message": "حذف {name}"
|
||||||
|
},
|
||||||
"app.instance.worlds.filter-modded": {
|
"app.instance.worlds.filter-modded": {
|
||||||
"message": "معدّل"
|
"message": "معدّل"
|
||||||
},
|
},
|
||||||
@@ -194,32 +419,44 @@
|
|||||||
"app.instance.worlds.no-worlds-heading": {
|
"app.instance.worlds.no-worlds-heading": {
|
||||||
"message": "لم تتم إضافة أي من الخوادم أو العوالم"
|
"message": "لم تتم إضافة أي من الخوادم أو العوالم"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.remove-button": {
|
||||||
|
"message": "إزالة الخادم"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.title": {
|
||||||
|
"message": "إزالة الخادم"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-body": {
|
||||||
|
"message": "سيتم حذف هذا الخادم من قائمة الخوادم الخاصة بك ومن قائمة الخوادم داخل اللعبة. يمكنك إضافته مرة أخرى لاحقًا إذا كنت تعرف عنوانه."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-header": {
|
||||||
|
"message": "إزالة {name}"
|
||||||
|
},
|
||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "ابحث بين ال{count} عوالم..."
|
"message": "ابحث بين ال{count} عوالم..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "المحتوى مطلوب"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "نزل للعب"
|
"message": "نزل للعب"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "تثبيت على أي حال"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "تثبيت"
|
"message": "تثبيت"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# تعديل} other {# تعديلات}}"
|
"message": "{count, plural, one {# تعديل} other {# تعديلات}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "حُزْمَة التعديل مطلوبة"
|
"message": "لا يتم مراجعة الملف إلا إذا تم نشره على Modrinth، بغض النظر عن صيغته (بما في ذلك .mrpack)."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "يتطلب هذا الخادم تعديلات للعب. انقر فوق \"تثبيت\" لإعداد الملفات المطلوبة من Modrinth، ثم قم بتشغيله مباشرة إلى الخادم."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "النماذج المشتركة"
|
"message": "النماذج المشتركة"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
"message": "نماذج الخادم مشتركة"
|
"message": "تحذير ملفات غير معروفة"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "ملفات غير متعرّف عليها"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "عرض المحتويات"
|
"message": "عرض المحتويات"
|
||||||
@@ -227,17 +464,26 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "حدث للعب"
|
"message": "حدث للعب"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "يلزم التحديث"
|
"message": "هذا المشروع مُثبَّت بالفعل"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required-description": {
|
"app.project.install-button.switch-version": {
|
||||||
"message": "هناك تحديث مطلوب للعب بـ {name}. الرجاء التحديث إلى أحدث اصدار لتشغيل اللعبة."
|
"message": "تغيير الإصدار"
|
||||||
},
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "العودة إلى الاستكشاف"
|
"message": "العودة إلى الاستكشاف"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "تثبيت المحتويات الى النموذج"
|
"message": "جميع الإصدارات"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "التنزيل من المتصفح"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "التثبيت"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "مثبت بالفعل"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "تم تفعيل وضع المطوّر."
|
"message": "تم تفعيل وضع المطوّر."
|
||||||
@@ -281,6 +527,12 @@
|
|||||||
"app.skins.delete-modal.title": {
|
"app.skins.delete-modal.title": {
|
||||||
"message": "هل أنت متأكد من حذف المظهر هذا؟"
|
"message": "هل أنت متأكد من حذف المظهر هذا؟"
|
||||||
},
|
},
|
||||||
|
"app.skins.dropped-file-error.text": {
|
||||||
|
"message": "فشل قراءة الملف الذي تم إسقاطه."
|
||||||
|
},
|
||||||
|
"app.skins.dropped-file-error.title": {
|
||||||
|
"message": "حدث خطأ أثناء معالجة الملف"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "تعديل المظهر"
|
"message": "تعديل المظهر"
|
||||||
},
|
},
|
||||||
@@ -290,6 +542,15 @@
|
|||||||
"app.skins.modal.add-title": {
|
"app.skins.modal.add-title": {
|
||||||
"message": "إضافة المظهر"
|
"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": {
|
"app.skins.modal.cape-fallback-name": {
|
||||||
"message": "رداء"
|
"message": "رداء"
|
||||||
},
|
},
|
||||||
@@ -308,12 +569,18 @@
|
|||||||
"app.skins.modal.none-cape-option": {
|
"app.skins.modal.none-cape-option": {
|
||||||
"message": "لا شيء"
|
"message": "لا شيء"
|
||||||
},
|
},
|
||||||
|
"app.skins.modal.replace-texture-button": {
|
||||||
|
"message": "استبدال النسيج"
|
||||||
|
},
|
||||||
"app.skins.modal.save-skin-button": {
|
"app.skins.modal.save-skin-button": {
|
||||||
"message": "حفظ المظهر"
|
"message": "حفظ المظهر"
|
||||||
},
|
},
|
||||||
"app.skins.modal.saving-tooltip": {
|
"app.skins.modal.saving-tooltip": {
|
||||||
"message": "حفظ..."
|
"message": "حفظ..."
|
||||||
},
|
},
|
||||||
|
"app.skins.modal.texture-section": {
|
||||||
|
"message": "النسيج"
|
||||||
|
},
|
||||||
"app.skins.modal.upload-skin-first-tooltip": {
|
"app.skins.modal.upload-skin-first-tooltip": {
|
||||||
"message": "أرفع المظهر أولا !"
|
"message": "أرفع المظهر أولا !"
|
||||||
},
|
},
|
||||||
@@ -323,15 +590,81 @@
|
|||||||
"app.skins.previewing-badge": {
|
"app.skins.previewing-badge": {
|
||||||
"message": "أستعراض"
|
"message": "أستعراض"
|
||||||
},
|
},
|
||||||
|
"app.skins.rate-limit.text": {
|
||||||
|
"message": "أنت تقوم بتغيير مظهرك بشكل متكرر جدًّا. وقد قامت خوادم Mojang بحظر الطلبات الإضافية مؤقتًا. يرجى الانتظار قليلاً قبل إعادة المحاولة."
|
||||||
|
},
|
||||||
"app.skins.rate-limit.title": {
|
"app.skins.rate-limit.title": {
|
||||||
"message": "تمهل !"
|
"message": "تمهل !"
|
||||||
},
|
},
|
||||||
|
"app.skins.reorder-error.text": {
|
||||||
|
"message": "تعذر حفظ طلبك المتعلق بشكل الشخصية."
|
||||||
|
},
|
||||||
|
"app.skins.reorder-error.title": {
|
||||||
|
"message": "فشل إعادة ترتيب أشكال الشخصيات"
|
||||||
|
},
|
||||||
|
"app.skins.section.builders-and-biomes": {
|
||||||
|
"message": "البناة والبيئات الحيوية"
|
||||||
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "الفوضى المربعة"
|
||||||
|
},
|
||||||
|
"app.skins.section.chase-the-skies": {
|
||||||
|
"message": "انطلق نحو السماء"
|
||||||
|
},
|
||||||
|
"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"
|
||||||
|
},
|
||||||
|
"app.skins.section.modrinth-pride.tooltip": {
|
||||||
|
"message": "لقد حصلت على هذه أشكال الشخصيات مقابل تبرعك لحملة جمع التبرعات التي نظمتها Modrinth Pride خلال شهر الفخر."
|
||||||
|
},
|
||||||
|
"app.skins.section.mounts-of-mayhem": {
|
||||||
|
"message": "جبال الفوضى"
|
||||||
|
},
|
||||||
|
"app.skins.section.saved-skins": {
|
||||||
|
"message": "المظاهر المحفوظة"
|
||||||
|
},
|
||||||
|
"app.skins.section.striding-hero": {
|
||||||
|
"message": "البطل السائر بخطوات واسعة"
|
||||||
|
},
|
||||||
|
"app.skins.section.the-copper-age": {
|
||||||
|
"message": "العصر النحاسي"
|
||||||
|
},
|
||||||
|
"app.skins.section.the-garden-awakens": {
|
||||||
|
"message": "الحديقة تستيقظ"
|
||||||
|
},
|
||||||
|
"app.skins.section.tiny-takeover": {
|
||||||
|
"message": "الاستحواذ الصغير"
|
||||||
|
},
|
||||||
|
"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": {
|
"app.skins.sign-in.title": {
|
||||||
"message": "الرجاء تسجيل الدخول"
|
"message": "الرجاء تسجيل الدخول"
|
||||||
},
|
},
|
||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "اختيار المظهر"
|
"message": "اختيار المظهر"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "إيقاف"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "تشغيل"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "انتهى تنزيل تطبيق Modrinth v{version}. أعد التحميل للتحديث الآن، أو تلقائيًا عند إغلاق تطبيق Modrinth."
|
"message": "انتهى تنزيل تطبيق Modrinth v{version}. أعد التحميل للتحديث الآن، أو تلقائيًا عند إغلاق تطبيق Modrinth."
|
||||||
},
|
},
|
||||||
@@ -350,6 +683,9 @@
|
|||||||
"app.update-popup.download-complete": {
|
"app.update-popup.download-complete": {
|
||||||
"message": "اكتمل التنزيل"
|
"message": "اكتمل التنزيل"
|
||||||
},
|
},
|
||||||
|
"app.update-popup.reload": {
|
||||||
|
"message": "أعد التحميل للتحديث"
|
||||||
|
},
|
||||||
"app.update-popup.title": {
|
"app.update-popup.title": {
|
||||||
"message": "تحديث متاح"
|
"message": "تحديث متاح"
|
||||||
},
|
},
|
||||||
@@ -440,6 +776,24 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>سجّل الدخول إلى حساب Modrinth</link> لإضافة الأصدقاء ومعرفة ما الذي يلعبونه!"
|
"message": "<link>سجّل الدخول إلى حساب Modrinth</link> لإضافة الأصدقاء ومعرفة ما الذي يلعبونه!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "إنشاء اختصار"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "مزيد من الخيارات"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "فتح المجلد"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "إصلاح"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "قيد التشغيل..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "قيد الإيقاف..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "إضافة واللعب"
|
"message": "إضافة واللعب"
|
||||||
},
|
},
|
||||||
@@ -482,6 +836,9 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "حفظ ك..."
|
"message": "حفظ ك..."
|
||||||
},
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "لم تُلعب من قبل"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "العنوان"
|
"message": "العنوان"
|
||||||
},
|
},
|
||||||
@@ -548,6 +905,30 @@
|
|||||||
"instance.settings.tabs.general.name": {
|
"instance.settings.tabs.general.name": {
|
||||||
"message": "الاسم"
|
"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": {
|
"instance.settings.tabs.hooks": {
|
||||||
"message": "إجراءات تشغيل إضافية"
|
"message": "إجراءات تشغيل إضافية"
|
||||||
},
|
},
|
||||||
@@ -596,6 +977,24 @@
|
|||||||
"instance.settings.tabs.java": {
|
"instance.settings.tabs.java": {
|
||||||
"message": "جافا والذاكرة"
|
"message": "جافا والذاكرة"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.java.custom-environment-variables": {
|
||||||
|
"message": "متغيرات البيئة المخصصة"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.custom-java-arguments": {
|
||||||
|
"message": "معلمات Java المخصصة"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.custom-java-installation": {
|
||||||
|
"message": "تثبيت Java المخصص"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||||
|
"message": "تخصيص الذاكرة حسب الطلب"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.enter-environment-variables": {
|
||||||
|
"message": "أدخل المتغيرات البيئية..."
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.enter-java-arguments": {
|
||||||
|
"message": "أدخل معلمات Java..."
|
||||||
|
},
|
||||||
"instance.settings.tabs.java.environment-variables": {
|
"instance.settings.tabs.java.environment-variables": {
|
||||||
"message": "المتغيرات البيئية"
|
"message": "المتغيرات البيئية"
|
||||||
},
|
},
|
||||||
@@ -653,6 +1052,9 @@
|
|||||||
"instance.worlds.copy_address": {
|
"instance.worlds.copy_address": {
|
||||||
"message": "نسخ العنوان"
|
"message": "نسخ العنوان"
|
||||||
},
|
},
|
||||||
|
"instance.worlds.create_shortcut": {
|
||||||
|
"message": "إنشاء اختصار"
|
||||||
|
},
|
||||||
"instance.worlds.dont_show_on_home": {
|
"instance.worlds.dont_show_on_home": {
|
||||||
"message": "عدم العرض في الصفحة الرئيسية"
|
"message": "عدم العرض في الصفحة الرئيسية"
|
||||||
},
|
},
|
||||||
@@ -692,6 +1094,12 @@
|
|||||||
"minecraft-account.label": {
|
"minecraft-account.label": {
|
||||||
"message": "حساب ماينكرافت"
|
"message": "حساب ماينكرافت"
|
||||||
},
|
},
|
||||||
|
"minecraft-account.not-signed-in": {
|
||||||
|
"message": "لم يتم تسجيل الدخول"
|
||||||
|
},
|
||||||
|
"minecraft-account.remove-account": {
|
||||||
|
"message": "حذف الحساب"
|
||||||
|
},
|
||||||
"minecraft-account.select-account": {
|
"minecraft-account.select-account": {
|
||||||
"message": "اختيار الحساب"
|
"message": "اختيار الحساب"
|
||||||
},
|
},
|
||||||
@@ -721,8 +1129,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "يتم توفير المحمّل من قبل الخادم"
|
"message": "يتم توفير المحمّل من قبل الخادم"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "لا تعرض هذا التحذير مجددا"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Skrýt více spuštěných instancí"
|
"message": "Skrýt více spuštěných instancí"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Zkopírováno"
|
||||||
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Zavřít"
|
"message": "Zavřít"
|
||||||
},
|
},
|
||||||
@@ -20,6 +23,9 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Zkusit znovu"
|
"message": "Zkusit znovu"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Zrušeno"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Neznámá instance"
|
"message": "Neznámá instance"
|
||||||
},
|
},
|
||||||
@@ -167,9 +173,6 @@
|
|||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Objevit servery"
|
"message": "Objevit servery"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
|
||||||
"message": "Skrýt již přidané servery"
|
|
||||||
},
|
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacky"
|
"message": "Modpacky"
|
||||||
},
|
},
|
||||||
@@ -219,7 +222,7 @@
|
|||||||
"message": "Dokončení instalace"
|
"message": "Dokončení instalace"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Příprava instance"
|
"message": "Ve frontě na instalaci"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Příprava Javy"
|
"message": "Příprava Javy"
|
||||||
@@ -359,9 +362,6 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Hledat v {count} světech..."
|
"message": "Hledat v {count} světech..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Požadovaný obsah"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Nainstaluj pro hraní"
|
"message": "Nainstaluj pro hraní"
|
||||||
},
|
},
|
||||||
@@ -371,38 +371,32 @@
|
|||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mód} few {# módy} other {# módů}}"
|
"message": "{count, plural, one {# mód} few {# módy} other {# módů}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-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 a poté se rovnou připoj na server."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Sdílená instance"
|
"message": "Sdílená instance"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Sdílená serverová instance"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Zobrazit obsah"
|
"message": "Zobrazit obsah"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Aktualizuj pro 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": "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": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Tento projekt je již nainstalován"
|
"message": "Tento projekt je již nainstalován"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Změnit verzi"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Zpět k Objevování"
|
"message": "Zpět k Objevování"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Nainstalovat obsah do instance"
|
"message": "Všechny verze"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Stáhnout v prohlížeči"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Již staženo"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Vývojářský režim povolen."
|
"message": "Vývojářský režim povolen."
|
||||||
@@ -524,6 +518,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -1018,26 +1015,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader zprostředkovává server"
|
"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, bez ohledu na jeho formát (včetně formátu .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Toto varování znovu nezobrazovat"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Potvrdit instalaci"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Přesto nainstalovat"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Malware se často šíří prostřednictvím souborů s modpacky, které se sdílejí na platformách jako Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Tento soubor jsme na Modrinthu nenašli. Důrazně doporučujeme instalovat pouze soubory z důvěryhodných zdrojů."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Upozornění na neznámý soubor"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,45 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Gem flere kørende instances"
|
"message": "Gem flere kørende instances"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Kopiere"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Kopier detaljer"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "Tilsidesæt"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "Åben instance"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "Prøv igen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Annulleret på grund af appen blev lukket"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Annulleret"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Kunne ikke download filer"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Downloaded filer er korrupt"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Kunne ikke gemme filer"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "Download kunne ikke blive fuldført"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "Instance kunne ikke blive fundet"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "Ukendt instance"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Gør til primære instance"
|
"message": "Gør til primære instance"
|
||||||
},
|
},
|
||||||
@@ -141,7 +180,7 @@
|
|||||||
"message": "Opdag servere"
|
"message": "Opdag servere"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "Gem allerede tilføjet til servere"
|
"message": "Gem servere som allerede er tilføjet"
|
||||||
},
|
},
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacks"
|
"message": "Modpacks"
|
||||||
@@ -165,7 +204,7 @@
|
|||||||
"message": "Eksporter modpack"
|
"message": "Eksporter modpack"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
"app.export-modal.modpack-name-label": {
|
||||||
"message": "Modpack Navn"
|
"message": "Modpack navn"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Modpack navn"
|
"message": "Modpack navn"
|
||||||
@@ -176,6 +215,15 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.downloading_content": {
|
||||||
|
"message": "Downloader indhold"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_minecraft": {
|
||||||
|
"message": "Downloader Minecraft"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "Downloader Java {version}"
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Al' data for din instance vil blive permanent slettet, dette inkludere dine verdener, konfigurationer, og alt installeret indhold."
|
"message": "Al' data for din instance vil blive permanent slettet, dette inkludere dine verdener, konfigurationer, og alt installeret indhold."
|
||||||
},
|
},
|
||||||
@@ -200,6 +248,9 @@
|
|||||||
"app.instance.modpack-already-installed.instance": {
|
"app.instance.modpack-already-installed.instance": {
|
||||||
"message": "Instance"
|
"message": "Instance"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "Downloader {current, number}/{total, number} projekter..."
|
||||||
|
},
|
||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "projekt"
|
"message": "projekt"
|
||||||
},
|
},
|
||||||
@@ -245,9 +296,6 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Søg {count} verdener..."
|
"message": "Søg {count} verdener..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Indhold krævet"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Installer for at spille"
|
"message": "Installer for at spille"
|
||||||
},
|
},
|
||||||
@@ -257,38 +305,23 @@
|
|||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} other {# mods}}"
|
"message": "{count, plural, one {# mod} other {# mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
|
||||||
"message": "Modpack krævet"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Denne server kræver mods for at spille. Tryk på installer for at sætte de krævet filler fra modrinth op, så lancer direkte til serveren."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Delt instance"
|
"message": "Delt instance"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Delt server instance"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Vis indhold"
|
"message": "Vis indhold"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Opdater for at spille"
|
"message": "Opdater for at spille"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "Opdatering krævet"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "En opdatering er krævet for at spille {name}. Venligst opdater til den seneste version for at køre spillet."
|
|
||||||
},
|
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Dette projekt er allerede installeret"
|
"message": "Dette projekt er allerede installeret"
|
||||||
},
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Tilbage til udforsk"
|
"message": "Tilbage til udforsk"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.versions.already-installed": {
|
||||||
"message": "Installer indhold til instance"
|
"message": "Allerede installeret"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Udvikler-tilstand aktiveret."
|
"message": "Udvikler-tilstand aktiveret."
|
||||||
@@ -395,6 +428,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -464,6 +500,9 @@
|
|||||||
"app.update-popup.download-complete": {
|
"app.update-popup.download-complete": {
|
||||||
"message": "Download færdiggjort"
|
"message": "Download færdiggjort"
|
||||||
},
|
},
|
||||||
|
"app.update-popup.reload": {
|
||||||
|
"message": "Genindlæs for at opdater"
|
||||||
|
},
|
||||||
"app.update-popup.title": {
|
"app.update-popup.title": {
|
||||||
"message": "Opdatering tilgængelig"
|
"message": "Opdatering tilgængelig"
|
||||||
},
|
},
|
||||||
@@ -662,6 +701,12 @@
|
|||||||
"instance.settings.tabs.general.name": {
|
"instance.settings.tabs.general.name": {
|
||||||
"message": "Navn"
|
"message": "Navn"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.general.update-channel.alpha": {
|
||||||
|
"message": "Alpha"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.general.update-channel.beta": {
|
||||||
|
"message": "Beta"
|
||||||
|
},
|
||||||
"instance.settings.tabs.hooks": {
|
"instance.settings.tabs.hooks": {
|
||||||
"message": "Startkommandoer"
|
"message": "Startkommandoer"
|
||||||
},
|
},
|
||||||
@@ -844,20 +889,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader er givet af serveren"
|
"message": "Loader er givet af serveren"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "En fil behandles kun, hvis den uploades til Modrinth, uanset filformat (herunder .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Vis ikke denne advarsel igen"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Bekræft installation"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Installer alligevel"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Ukendt fil advarsel"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Weitere laufende Instanzen ausblenden"
|
"message": "Weitere laufende Instanzen ausblenden"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Kopiert"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Details kopieren"
|
||||||
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Ignorieren"
|
"message": "Ignorieren"
|
||||||
},
|
},
|
||||||
@@ -20,9 +26,72 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Wiederholen"
|
"message": "Wiederholen"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Aufgrund von Schließung der App abgebrochen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Modpack konnte nicht gelesen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Abgebrochen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "Bereinigung konnte nicht abgeschlossen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Dateien konnten nicht heruntergeladen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Heruntergeladene Datei ist beschädigt"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Dateien konnten nicht gespeichert werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "Download konnte nicht abgeschlossen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "Instanz konnte nicht gefunden werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "Dateipfad ist ungültig"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Daten des Modpacks sind ungültig"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Dateien des Modpacks enthalten ungültige Metadaten"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "Die Einrichtung von Java konnte nicht abgeschlossen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "Einrichtung des Loaders ist fehlgeschlagen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Lokale Daten konnten nicht aktualisiert werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "Einrichtung von Minecraft ist fehlgeschlagen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Modrinth konnte nicht erreicht werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Keine Berechtigung zum Schreiben"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Das Pack konnte nicht heruntergeladen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Etwas ist schiefgelaufen"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Unbekannte Instanz"
|
"message": "Unbekannte Instanz"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.updating-shared-content": {
|
||||||
|
"message": "Geteilte Inhalte werden aktualisiert"
|
||||||
|
},
|
||||||
"app.action-bar.installs": {
|
"app.action-bar.installs": {
|
||||||
"message": "Installationen"
|
"message": "Installationen"
|
||||||
},
|
},
|
||||||
@@ -59,6 +128,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Protokolle anzeigen"
|
"message": "Protokolle anzeigen"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Alle akzeptieren"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Werbung ermöglicht Modrinth und finanziert die Auszahlungen an die Ersteller. Unsere Partner speichern möglicherweise Cookies in der App oder greifen auf diese zu, um Werbung zu personalisieren und die Leistung zu messen."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Einstellungen verwalten"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Alle ablehnen"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Deine Privatsphäre und wie Werbung Modrinth unterstützt"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Aktiviert erweiterte Rendering-Funktionen wie Unschärfeeffekte, welche ohne hardwarebeschleunigtes Rendering zu Leistungsproblemen führen können."
|
"message": "Aktiviert erweiterte Rendering-Funktionen wie Unschärfeeffekte, welche ohne hardwarebeschleunigtes Rendering zu Leistungsproblemen führen können."
|
||||||
},
|
},
|
||||||
@@ -117,10 +201,10 @@
|
|||||||
"message": "Spielzeit anzeigen"
|
"message": "Spielzeit anzeigen"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.skip-non-essential-warnings.description": {
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
"message": "Überspringt automatisch Bestätigungen mit geringem Risiko, wie z. B. die doppelte Installation von Modpacks, das Löschen normaler Inhalte, Massenaktualisierungen, das Trennen von Modpacks und Reparaturen. Warnungen bei gefährlichen Aktionen werden weiterhin angezeigt."
|
"message": "Bestätigungen mit geringem Risiko, wie z. B. die Installation doppelter Modpacks, das Löschen normaler Inhalte, Massenaktualisierungen, das Aufheben von Verknüpfungen zu Modpacks und Reparaturaufrufe, werden automatisch übersprungen. Gefährliche Warnungen werden weiterhin angezeigt."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.skip-non-essential-warnings.title": {
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
"message": "Nicht essenzielle Warnungen überspringen"
|
"message": "Unwichtige Warnungen überspringen"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "Ermöglicht das Umschalten der Seitenleiste."
|
"message": "Ermöglicht das Umschalten der Seitenleiste."
|
||||||
@@ -192,7 +276,7 @@
|
|||||||
"message": "Modpack exportieren"
|
"message": "Modpack exportieren"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
"app.export-modal.modpack-name-label": {
|
||||||
"message": "Modpaketname"
|
"message": "Name des Modpacks"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Modpaketname"
|
"message": "Modpaketname"
|
||||||
@@ -204,40 +288,40 @@
|
|||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
"app.install.phase.downloading_content": {
|
"app.install.phase.downloading_content": {
|
||||||
"message": "Lade Inhalte herunter"
|
"message": "Inhalte werden heruntergeladen"
|
||||||
},
|
},
|
||||||
"app.install.phase.downloading_minecraft": {
|
"app.install.phase.downloading_minecraft": {
|
||||||
"message": "Lade Minecraft herunter"
|
"message": "Minecraft wird heruntergeladen"
|
||||||
},
|
},
|
||||||
"app.install.phase.downloading_pack_file": {
|
"app.install.phase.downloading_pack_file": {
|
||||||
"message": "Lade Packdatei herunter"
|
"message": "Paketdatei wird herunterladen"
|
||||||
},
|
},
|
||||||
"app.install.phase.extracting_overrides": {
|
"app.install.phase.extracting_overrides": {
|
||||||
"message": "Überschreibungen extrahieren"
|
"message": "Überschreibungen werden extrahiert"
|
||||||
},
|
},
|
||||||
"app.install.phase.finalizing": {
|
"app.install.phase.finalizing": {
|
||||||
"message": "Abschliessen"
|
"message": "Wird finalisiert"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Instanz präparieren"
|
"message": "Installation in Warteschlange"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Java präparieren"
|
"message": "Java wird vorbereitet"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java.downloading": {
|
"app.install.phase.preparing_java.downloading": {
|
||||||
"message": "Java {version} herunterladen"
|
|
||||||
},
|
|
||||||
"app.install.phase.preparing_java.extracting": {
|
|
||||||
"message": "Java {version} extrahieren"
|
|
||||||
},
|
|
||||||
"app.install.phase.preparing_java.fetching-metadata": {
|
|
||||||
"message": "Java {version} wird heruntergeladen"
|
"message": "Java {version} wird heruntergeladen"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "Java {version} wird extrahiert"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "Java {version} wird abgerufen"
|
||||||
|
},
|
||||||
"app.install.phase.preparing_java.resolving": {
|
"app.install.phase.preparing_java.resolving": {
|
||||||
"message": "Java {version} präparieren"
|
"message": "Java {version} wird vorbereitet"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java.validating": {
|
"app.install.phase.preparing_java.validating": {
|
||||||
"message": "Java {version} validieren"
|
"message": "Java {version} wird validiert"
|
||||||
},
|
},
|
||||||
"app.install.phase.reading_pack_manifest": {
|
"app.install.phase.reading_pack_manifest": {
|
||||||
"message": "Paketmanifest wird gelesen"
|
"message": "Paketmanifest wird gelesen"
|
||||||
@@ -257,6 +341,36 @@
|
|||||||
"app.install.phase.running_loader_processors": {
|
"app.install.phase.running_loader_processors": {
|
||||||
"message": "Loader-Prozesse werden ausgeführt"
|
"message": "Loader-Prozesse werden ausgeführt"
|
||||||
},
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.added-label": {
|
||||||
|
"message": "Hinzugefügt"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-body": {
|
||||||
|
"message": "Deine lokale Instanz ist den Benutzern, mit denen du sie geteilt hast, voraus."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-header": {
|
||||||
|
"message": "Deine Änderungen wurden noch nicht geteilt"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publish-button": {
|
||||||
|
"message": "Update senden"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publishing-button": {
|
||||||
|
"message": "Wird gesendet..."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.removed-label": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-admonition-header": {
|
||||||
|
"message": "Update senden"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-description": {
|
||||||
|
"message": "Überprüfe die Inhaltsänderungen, die allen Nutzern dieser Instanz bereitgestellt werden."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-header": {
|
||||||
|
"message": "Änderungen überprüfen"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.reviewing-button": {
|
||||||
|
"message": "Wird überprüft..."
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Alle Daten deiner Instanz werden permanent gelöscht, inlusive deiner Welten, Konfigurationen und allen installierten Inhalten."
|
"message": "Alle Daten deiner Instanz werden permanent gelöscht, inlusive deiner Welten, Konfigurationen und allen installierten Inhalten."
|
||||||
},
|
},
|
||||||
@@ -282,10 +396,10 @@
|
|||||||
"message": "Instanz"
|
"message": "Instanz"
|
||||||
},
|
},
|
||||||
"app.instance.mods.bulk-update.downloading-projects": {
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
"message": "Lade {current, number}/{total, number} Projekte..."
|
"message": "{current, number}/{total, number} Projekte werden heruntergeladen..."
|
||||||
},
|
},
|
||||||
"app.instance.mods.bulk-update.finishing": {
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
"message": "Update abschliessen..."
|
"message": "Update wird fertiggestellt..."
|
||||||
},
|
},
|
||||||
"app.instance.mods.bulk-update.resolving-versions": {
|
"app.instance.mods.bulk-update.resolving-versions": {
|
||||||
"message": "Versionen werden ermittelt..."
|
"message": "Versionen werden ermittelt..."
|
||||||
@@ -293,6 +407,9 @@
|
|||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "Projekt"
|
"message": "Projekt"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.locked-content": {
|
||||||
|
"message": "Inhalte in gesperrten Instanzen können nicht geändert werden."
|
||||||
|
},
|
||||||
"app.instance.mods.project-was-added": {
|
"app.instance.mods.project-was-added": {
|
||||||
"message": "\"{name}\" wurde hinzugefügt"
|
"message": "\"{name}\" wurde hinzugefügt"
|
||||||
},
|
},
|
||||||
@@ -308,6 +425,102 @@
|
|||||||
"app.instance.mods.successfully-uploaded": {
|
"app.instance.mods.successfully-uploaded": {
|
||||||
"message": "Erfolgreich hochgeladen"
|
"message": "Erfolgreich hochgeladen"
|
||||||
},
|
},
|
||||||
|
"app.instance.share.empty.description": {
|
||||||
|
"message": "Du kannst diese Instanz mit deinen Freunden teilen!"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.heading": {
|
||||||
|
"message": "Keine Freunde eingeladen"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.invite-friends-button": {
|
||||||
|
"message": "Freunde einladen"
|
||||||
|
},
|
||||||
|
"app.instance.share.invite-modal.heading": {
|
||||||
|
"message": "{name} teilen"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-prefix": {
|
||||||
|
"message": "Du musst dich als"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-suffix": {
|
||||||
|
"message": "anmelden um diese Seite aufzurufen."
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.linked-account-fallback": {
|
||||||
|
"message": "das verknüpfte Konto"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.signed-out-heading": {
|
||||||
|
"message": "Nicht angemeldet"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.switch-account-button": {
|
||||||
|
"message": "Konto wechseln"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.wrong-account-heading": {
|
||||||
|
"message": "Falsches Konto"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-access": {
|
||||||
|
"message": "Diese Person wird für diese geteilte Instanz erhalten keine Updates mehr erhalten"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-installed-copy": {
|
||||||
|
"message": "Jede bereits installierte Kopie bleibt auf deren Gerät erhalten"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-invite-again": {
|
||||||
|
"message": "Du kannst diese Person später erneut einladen"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-last-user": {
|
||||||
|
"message": "Dies ist der letzte Benutzer, das Teilen wird für diese Instanz deaktiviert"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effects-label": {
|
||||||
|
"message": "Was passiert?"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.header": {
|
||||||
|
"message": "Zugriff widerrufen"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.remove-button": {
|
||||||
|
"message": "Zugriff widerrufen"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.user-avatar-alt": {
|
||||||
|
"message": "Avatar von {username}"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.warning-body": {
|
||||||
|
"message": "Falls du den Zugriff von {username} auf diese geteilte Instanz widerrufst, musst du diese Person erneut einladen, bevor diese Updates erhalten kann."
|
||||||
|
},
|
||||||
|
"app.instance.share.sign-in.button": {
|
||||||
|
"message": "Anmelden"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.body": {
|
||||||
|
"message": "Du musst die Verknüpfung zu diesem Modpack trennen, um deine Instanz zu teilen"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.header": {
|
||||||
|
"message": "Zum Teilen muss die Verknüpfung getrennt werden"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.body": {
|
||||||
|
"message": "Diese geteilte Instanz ist bereits als <bold>{instanceName}</bold> installiert. Möchtest du wirklich eine weitere Kopie installieren?"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.header": {
|
||||||
|
"message": "Geteilte Instanz bereits installiert"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.install-anyway": {
|
||||||
|
"message": "Trotzdem Installieren"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.instance": {
|
||||||
|
"message": "Instanz"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.fallback-username": {
|
||||||
|
"message": "das verknüpfte Konto"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.owner-admonition-body-v2": {
|
||||||
|
"message": "um diese geteilte Instanz zu verwalten. Du wirst keine Updates an Nutzer senden können."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.sign-in-as-label": {
|
||||||
|
"message": "Anmelden als"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.signed-out-header": {
|
||||||
|
"message": "Du musst dich bei Modrinth anmelden"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.user-admonition-body-v2": {
|
||||||
|
"message": "um Updates für diese geteilte Instanz zu erhalten."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.warning-header": {
|
||||||
|
"message": "Du nutzt das falsche Modrinth-Konto"
|
||||||
|
},
|
||||||
"app.instance.worlds.add-server": {
|
"app.instance.worlds.add-server": {
|
||||||
"message": "Server hinzufügen"
|
"message": "Server hinzufügen"
|
||||||
},
|
},
|
||||||
@@ -321,7 +534,7 @@
|
|||||||
"message": "Welt löschen"
|
"message": "Welt löschen"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.delete-world-modal.warning-body": {
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
"message": "Diese Welt wird permanent gelöscht von dieser Instanz, dies kann nicht rückgängig gemacht werden."
|
"message": "Diese Welt wird permanent von dieser Instanz gelöscht. Diese Aktion kann nicht rückgängig gemacht werden."
|
||||||
},
|
},
|
||||||
"app.instance.worlds.delete-world-modal.warning-header": {
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
"message": "Lösche {name}"
|
"message": "Lösche {name}"
|
||||||
@@ -359,29 +572,89 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Durchsuche {count} Welten..."
|
"message": "Durchsuche {count} Welten..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
"app.modal.install-to-play.additional-context": {
|
||||||
"message": "Inhalte benötigt"
|
"message": "Zusätzlicher Kontext"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.additional-context-placeholder": {
|
||||||
|
"message": "Füge gegebenenfalls relevante Links und Bilder hinzu"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.content-you-are-reporting": {
|
||||||
|
"message": "Die Instanz, die du meldest"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.delete-instance": {
|
||||||
|
"message": "Instanz löschen"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.external-files-dont-install": {
|
||||||
|
"message": "Nicht Installieren"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Installieren zum Spielen"
|
"message": "Installieren zum Spielen"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Trotzdem Installieren"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Installieren"
|
"message": "Installieren"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Diese Einladung wurde von einem anderen Modrinth-Nutzer erstellt, nicht von Modrinth. Nimm nur Einladungen von Personen an, denen du vertraust."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# Mod} other {# Mods}}"
|
"message": "{count, plural, one {# Mod} other {# Mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.report-description": {
|
||||||
"message": "Benötigtes Modpack"
|
"message": "Nutze dieses Formular, um Instanzen zu melden, die möglicherweise gegen unsere <rules-link>Regeln</rules-link> oder <terms-link>Nutzungsbedingungen</terms-link> verstoßen."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
"app.modal.install-to-play.report-image-invalid-type": {
|
||||||
"message": "Dieser Server benötigt Mods zum spielen. Klicke auf Installieren um die nötigen Dateien von Modrinth herunterzuladen und dannach direkt dem Server beizutreten."
|
"message": "Datei ist kein zulässiger Bildtyp"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-image-too-large": {
|
||||||
|
"message": "Datei überschreitet die Größenbeschränkung von 1 MiB"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-legal-claims": {
|
||||||
|
"message": "Informationen zu DMCA-Meldungen oder anderen rechtlichen Forderungen findest du in unserer <copyright-link>Urheberrechtsrichtlinie</copyright-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason": {
|
||||||
|
"message": "Gegen welche Regel verstößt diese Instanz?"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.inappropriate": {
|
||||||
|
"message": "Unangemessen"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.malicious": {
|
||||||
|
"message": "Bösartig"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.spam": {
|
||||||
|
"message": "Spam"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-shared-instance-header": {
|
||||||
|
"message": "Geteilte Instanz melden"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-submitted": {
|
||||||
|
"message": "Meldung eingereicht"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-support-and-bugs": {
|
||||||
|
"message": "Wende dich bei Supportanfragen bitte an unser <support-link>Support-Team</support-link>. Um Fehler zu melden, öffne bitte ein <github-link>Issue auf GitHub</github-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
|
"message": "Eine Datei wird nur geprüft, wenn sie auf Modrinth veröffentlicht wird, unabhängig von ihrem Dateiformat (auch .mrpack)."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Geteilte Instanz"
|
"message": "Geteilte Instanz"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.shared-instance-content": {
|
||||||
"message": "Geteilte Server Instanz"
|
"message": "Inhalte der geteilten Instanz"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "Diese geteilte Instanz enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
|
"message": "Dieses Server-Modpack enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Warnung vor unbekannten Dateien"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Nicht erkannte Dateien"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Inhalte ansehen"
|
"message": "Inhalte ansehen"
|
||||||
@@ -389,20 +662,47 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Aktualisieren zum Spielen"
|
"message": "Aktualisieren zum Spielen"
|
||||||
},
|
},
|
||||||
|
"app.modal.update-to-play.removed": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.server-modpack-unknown-files-description": {
|
||||||
|
"message": "Dieses Update eines Server-Modpacks enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-added-label": {
|
||||||
|
"message": "Hinzugefügt"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-removed-label": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "Dieses Update einer geteilten Instanz enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.update-required": {
|
||||||
"message": "Aktualisierung benötigt"
|
"message": "Aktualisierung erforderlich"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required-description": {
|
"app.modal.update-to-play.update-required-description": {
|
||||||
"message": "Eine aktualisierung zum spielen von {name} ist benötigt. Bitte aktualisiere auf die neuste Version um das Spiel zu starten."
|
"message": "Zum Spielen von {name} ist eine Aktualisierung erforderlich. Bitte aktualisiere auf die neueste Version, um das Spiel zu starten."
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Dieses Projekt ist bereits installiert"
|
"message": "Dieses Projekt ist bereits installiert"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Version wechseln"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Zurück zu Entdecken"
|
"message": "Zurück zu Entdecken"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Inhalt in Instanz installieren"
|
"message": "Alle Versionen"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Im Browser herunterladen"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Wird installiert"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Bereits installiert"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Entwicklermodus aktiviert."
|
"message": "Entwicklermodus aktiviert."
|
||||||
@@ -410,6 +710,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "Lade v{version} herunter"
|
"message": "Lade v{version} herunter"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Werbung ermöglicht Modrinth und finanziert die Auszahlungen an die Ersteller. Unsere Partner speichern möglicherweise Cookies in der App oder greifen auf diese zu, um Werbung zu personalisieren und die Leistung zu messen. Du kannst dies unten deaktivieren oder deine Einstellungen verwalten."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Erscheinungsbild"
|
"message": "Erscheinungsbild"
|
||||||
},
|
},
|
||||||
@@ -452,6 +755,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Fehler bei der Dateiverarbeitung"
|
"message": "Fehler bei der Dateiverarbeitung"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Dieser Skin nutzt Funktionen aus dem {ears}-Mod"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Skin bearbeiten"
|
"message": "Skin bearbeiten"
|
||||||
},
|
},
|
||||||
@@ -524,6 +830,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -575,6 +884,12 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Skin-Auswahl"
|
"message": "Skin-Auswahl"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Deaktivieren"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Aktivieren"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App v{version} wurde heruntergeladen. Lade die App neu um jetzt zu aktualisieren, oder automatisch nach dem schliessen der Modrinth App."
|
"message": "Modrinth App v{version} wurde heruntergeladen. Lade die App neu um jetzt zu aktualisieren, oder automatisch nach dem schliessen der Modrinth App."
|
||||||
},
|
},
|
||||||
@@ -623,6 +938,39 @@
|
|||||||
"app.world.world-item.players-online": {
|
"app.world.world-item.players-online": {
|
||||||
"message": "{count} online"
|
"message": "{count} online"
|
||||||
},
|
},
|
||||||
|
"content.shared-instance.change-version-body": {
|
||||||
|
"message": "Das Ändern der Version wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können diese wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-bulk-body": {
|
||||||
|
"message": "Einige ausgewählte Projekte sind Teil der geteilten Instanz. Wenn du diese löschst, wirkt sich dies nur auf deine lokale Kopie aus, und zukünftige Updates der geteilten Instanz können diese möglicherweise wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-button": {
|
||||||
|
"message": "Trotzdem löschen"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-many-button": {
|
||||||
|
"message": "{count, plural, one {# Projekt} other {# Projekte}} trotzdem löschen"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-single-body": {
|
||||||
|
"message": "Das Löschen wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können dies wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-bulk-body": {
|
||||||
|
"message": "Einige ausgewählte Projekte sind Teil der geteilten Instanz. Wenn du diese deaktivierst, wirkt sich dies nur auf deine lokale Kopie aus, und zukünftige Updates der geteilten Instanz können diese möglicherweise wieder aktivieren, wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-button": {
|
||||||
|
"message": "Trotzdem deaktivieren"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-many-button": {
|
||||||
|
"message": "{count, plural, one {# Projekt} other {# Projekte}} trotzdem deaktivieren"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-single-body": {
|
||||||
|
"message": "Das Deaktivieren wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können dies wieder aktivieren, wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.unlink-body": {
|
||||||
|
"message": "Das Aufheben der Verknüpfung wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können diese wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.warning-header": {
|
||||||
|
"message": "Dies ist Teil der geteilten Instanz"
|
||||||
|
},
|
||||||
"friends.action.add-friend": {
|
"friends.action.add-friend": {
|
||||||
"message": "Freund hinzufügen"
|
"message": "Freund hinzufügen"
|
||||||
},
|
},
|
||||||
@@ -686,6 +1034,75 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Logge dich in ein Modrinth Konto ein</link>, um Freunde hinzuzufügen und zu sehen, was sie spielen!"
|
"message": "<link>Logge dich in ein Modrinth Konto ein</link>, um Freunde hinzuzufügen und zu sehen, was sie spielen!"
|
||||||
},
|
},
|
||||||
|
"installation-settings.shared-instance.linked-title": {
|
||||||
|
"message": "Verknüpfte geteilte Instanz"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.title": {
|
||||||
|
"message": "Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-button": {
|
||||||
|
"message": "Geteilte Instanz trennen"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-description": {
|
||||||
|
"message": "Trenne diese lokale Instanz von zukünftigen geteilten Updates."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlinking-button": {
|
||||||
|
"message": "Wird getrennt..."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-button": {
|
||||||
|
"message": "Geteilte Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-description": {
|
||||||
|
"message": "Entferne diese geteilte Instanz von Modrinth und sende keine Updates mehr an Personen, die sie nutzen. Deine lokale Instanz ist davon nicht betroffen."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublishing-button": {
|
||||||
|
"message": "Wird zurückgezogen..."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "Dies betrifft nur deine lokale Instanz. Deine installierten Inhalte bleiben auf diesem Gerät, und die freigegebene Instanz sowie andere Benutzer, die diese verwenden, sind davon nicht betroffen."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Geteilte Instanz trennen"
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.header": {
|
||||||
|
"message": "Geteilte Instanz trennen"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "Dadurch wird die geteilte Instanz von den Servern von Modrinth gelöscht. Personen, die diese in der Modrinth-App nutzen, erhalten keine Updates mehr, aber deine lokale Instanz und dessen Inhalte bleiben auf diesem Gerät erhalten."
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Geteilte Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.header": {
|
||||||
|
"message": "Geteilte Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Verknüpfung erstellen"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Modpack exportieren"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Instanz starten"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "Weitere Aktionen"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Ordner öffnen"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Reparieren"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Instanz-Einstellungen"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Wird gestartet..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Wird gestoppt..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Ersteue u starte"
|
"message": "Ersteue u starte"
|
||||||
},
|
},
|
||||||
@@ -728,6 +1145,15 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Speichern unter..."
|
"message": "Speichern unter..."
|
||||||
},
|
},
|
||||||
|
"instance.locked.delete-button": {
|
||||||
|
"message": "Instanz löschen"
|
||||||
|
},
|
||||||
|
"instance.locked.play-tooltip": {
|
||||||
|
"message": "Diese Instanz wurde gesperrt"
|
||||||
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Noch nie gespielt"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Adresse"
|
"message": "Adresse"
|
||||||
},
|
},
|
||||||
@@ -863,6 +1289,9 @@
|
|||||||
"instance.settings.tabs.installation.loader-version": {
|
"instance.settings.tabs.installation.loader-version": {
|
||||||
"message": "{loader} Version"
|
"message": "{loader} Version"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.installation.locked": {
|
||||||
|
"message": "Installationseinstellungen sind nicht verfügbar, solange diese Instanz gesperrt ist."
|
||||||
|
},
|
||||||
"instance.settings.tabs.java": {
|
"instance.settings.tabs.java": {
|
||||||
"message": "Java und Arbeitsspeicher"
|
"message": "Java und Arbeitsspeicher"
|
||||||
},
|
},
|
||||||
@@ -902,6 +1331,9 @@
|
|||||||
"instance.settings.tabs.java.java-path-placeholder": {
|
"instance.settings.tabs.java.java-path-placeholder": {
|
||||||
"message": "/pfad/zu/java"
|
"message": "/pfad/zu/java"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.sharing": {
|
||||||
|
"message": "Teilen"
|
||||||
|
},
|
||||||
"instance.settings.tabs.window": {
|
"instance.settings.tabs.window": {
|
||||||
"message": "Spielfenster"
|
"message": "Spielfenster"
|
||||||
},
|
},
|
||||||
@@ -932,6 +1364,57 @@
|
|||||||
"instance.settings.tabs.window.width.enter": {
|
"instance.settings.tabs.window.width.enter": {
|
||||||
"message": "Breite eingeben..."
|
"message": "Breite eingeben..."
|
||||||
},
|
},
|
||||||
|
"instance.shared-instance.error.title": {
|
||||||
|
"message": "Etwas ist schiefgelaufen"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.owner-tooltip": {
|
||||||
|
"message": "Der Inhalt dieser Instanz wird mit anderen Benutzern geteilt."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.added-label": {
|
||||||
|
"message": "Hinzugefügt"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.admonition-header": {
|
||||||
|
"message": "Update an Spieler senden"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.config-title-v2": {
|
||||||
|
"message": "Konfigurationsdateien auswählen"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.description": {
|
||||||
|
"message": "Überprüfe die Inhaltsänderungen und wähle Konfigurationsdateien aus, die in diesem Update enthalten sein sollen."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.header": {
|
||||||
|
"message": "Änderungen überprüfen"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.publish-button": {
|
||||||
|
"message": "Update senden"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.removed-label": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.tooltip": {
|
||||||
|
"message": "Der Inhalt dieser Instanz wird von jemand anderes verwaltet."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.access-revoked-text": {
|
||||||
|
"message": "Dein Zugriff auf die geteilte Instanz wurde widerrufen. Diese Instanz ist weiterhin verfügbar, ist jedoch nicht mehr verknüpft und erhält keine Updates mehr."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.deleted-text": {
|
||||||
|
"message": "Die primäre Instanz wurde gelöscht. Diese Instanz ist weiterhin verfügbar, ist jedoch nicht mehr verknüpft und erhält keine Updates mehr."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-text": {
|
||||||
|
"message": "Diese geteilte Instanz wurde vom Inhaltsmoderationsteam gesperrt. Sie erhält keine Updates von der primären Instanz mehr und kann nicht mehr gespielt werden."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-title": {
|
||||||
|
"message": "Instanz gesperrt"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.manager-fallback": {
|
||||||
|
"message": "der Instanzmanager"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.text": {
|
||||||
|
"message": "Deine lokale Instanz ist weiterhin verfügbar, ist jedoch nicht mehr verknüpft und erhält keine Updates mehr."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.title": {
|
||||||
|
"message": "Geteilte Instanz nicht mehr verfügbar"
|
||||||
|
},
|
||||||
"instance.worlds.a_minecraft_server": {
|
"instance.worlds.a_minecraft_server": {
|
||||||
"message": "Ein Minecraft-Server"
|
"message": "Ein Minecraft-Server"
|
||||||
},
|
},
|
||||||
@@ -995,6 +1478,63 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "In Minecraft anmelden"
|
"message": "In Minecraft anmelden"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Du benötigst ein Microsoft-Konto, welches Minecraft besitzt, bevor du das Spiel starten und spielen kannst."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Bei einem Microsoft-Konto anmelden"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Du hast kein Konto?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Minecraft holen"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Hilfe erhalten"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft erforderlich"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Bei Microsoft anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.browser-description": {
|
||||||
|
"message": "Ein neuer Tab zum Anmelden wurde geöffnet. Schließe die Anmeldung dort ab und kehren anschließend zur App zurück."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.cancel-button": {
|
||||||
|
"message": "Abbrechen"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.continue-in-browser-heading": {
|
||||||
|
"message": "Im Browser fortfahren"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.create-account-button": {
|
||||||
|
"message": "Ein Konto erstellen"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.description": {
|
||||||
|
"message": "Du musst dich bei deinem Modrinth-Konto anmelden, bevor du diese Funktion nutzen kannst."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.header": {
|
||||||
|
"message": "Konto erforderlich"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.open-browser-again-button": {
|
||||||
|
"message": "Browser erneut öffnen"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-button": {
|
||||||
|
"message": "Bei Modrinth anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-heading": {
|
||||||
|
"message": "Bei einem Modrinth-Konto anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.signing-in-header": {
|
||||||
|
"message": "Anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.support-prompt": {
|
||||||
|
"message": "Hast du Probleme bei der Anmeldung? <support>Hilfe erhalten</support>"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.waiting-for-browser": {
|
||||||
|
"message": "Warte auf Bestätigung durch den Browser..."
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Von der Instanz vorgegeben"
|
"message": "Von der Instanz vorgegeben"
|
||||||
},
|
},
|
||||||
@@ -1018,26 +1558,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader wird vom Server bereitgestellt"
|
"message": "Loader wird vom Server bereitgestellt"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Eine Datei wird nur geprüft, wenn sie auf Modrinth hochgeladen wird, unabhängig von ihrem Dateiformat (auch .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Diese Warnung nicht mehr anzeigen"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Installation bestätigen"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Trotzdem installieren"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Schadsoftware wird häufig über Modpack-Dateien verbreitet, indem diese auf Plattformen wie Discord geteilt werden."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Wir konnten diese Datei auf Modrinth nicht finden. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Warnung vor unbekannter Datei"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Weitere laufende Instanzen ausblenden"
|
"message": "Weitere laufende Instanzen ausblenden"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Kopiert"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Details kopieren"
|
||||||
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Ausblenden"
|
"message": "Ausblenden"
|
||||||
},
|
},
|
||||||
@@ -20,9 +26,72 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Erneut versuchen"
|
"message": "Erneut versuchen"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Aufgrund von Schließung der App abgebrochen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Modpack konnte nicht gelesen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Abgebrochen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "Bereinigung konnte nicht abgeschlossen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Dateien konnten nicht heruntergeladen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Heruntergeladene Datei ist beschädigt"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Dateien konnten nicht gespeichert werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "Download konnte nicht abgeschlossen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "Instanz konnte nicht gefunden werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "Dateipfad ist ungültig"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Daten des Modpacks sind ungültig"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Dateien des Modpacks enthalten ungültige Metadaten"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "Die Einrichtung von Java konnte nicht abgeschlossen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "Einrichtung des Loaders ist fehlgeschlagen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Lokale Daten konnten nicht aktualisiert werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "Einrichtung von Minecraft ist fehlgeschlagen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Modrinth konnte nicht erreicht werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Keine Berechtigung zum Schreiben"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Das Pack konnte nicht heruntergeladen werden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Etwas ist schiefgelaufen"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Unbekannte Instanz"
|
"message": "Unbekannte Instanz"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.updating-shared-content": {
|
||||||
|
"message": "Geteilte Inhalte werden aktualisiert"
|
||||||
|
},
|
||||||
"app.action-bar.installs": {
|
"app.action-bar.installs": {
|
||||||
"message": "Installationen"
|
"message": "Installationen"
|
||||||
},
|
},
|
||||||
@@ -59,6 +128,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Logs anzeigen"
|
"message": "Logs anzeigen"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Alle akzeptieren"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Werbung ermöglicht Modrinth und finanziert die Auszahlungen an die Ersteller. Unsere Partner speichern möglicherweise Cookies in der App oder greifen auf diese zu, um Werbung zu personalisieren und die Leistung zu messen."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Einstellungen verwalten"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Alle ablehnen"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Deine Privatsphäre und wie Werbung Modrinth unterstützt"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Aktiviert erweiterte Rendering-Funktionen wie Unschärfe-Effekte, welche ohne Hardware-beschleunigtes Rendering zu Leistungsproblemen führen können."
|
"message": "Aktiviert erweiterte Rendering-Funktionen wie Unschärfe-Effekte, welche ohne Hardware-beschleunigtes Rendering zu Leistungsproblemen führen können."
|
||||||
},
|
},
|
||||||
@@ -102,7 +186,7 @@
|
|||||||
"message": "Launcher minimieren"
|
"message": "Launcher minimieren"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.native-decorations.description": {
|
"app.appearance-settings.native-decorations.description": {
|
||||||
"message": "Fensterdekorationen des Systems verwenden (Neustart der App erforderlich)."
|
"message": "Fensterrahmen des Systems verwenden (Neustart der App erforderlich)."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.native-decorations.title": {
|
"app.appearance-settings.native-decorations.title": {
|
||||||
"message": "Native Dekorationen"
|
"message": "Native Dekorationen"
|
||||||
@@ -117,7 +201,7 @@
|
|||||||
"message": "Spielzeit anzeigen"
|
"message": "Spielzeit anzeigen"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.skip-non-essential-warnings.description": {
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
"message": "Überspringt automatisch Bestätigungen mit geringem Risiko, wie z. B. die doppelte Installation von Modpacks, das Löschen normaler Inhalte, Massenaktualisierungen, das Trennen von Modpacks und Reparaturen. Warnungen bei gefährlichen Aktionen werden weiterhin angezeigt."
|
"message": "Bestätigungen mit geringem Risiko, wie z. B. die Installation doppelter Modpacks, das Löschen normaler Inhalte, Massenaktualisierungen, das Aufheben von Verknüpfungen zu Modpacks und Reparaturaufrufe, werden automatisch übersprungen. Gefährliche Warnungen werden weiterhin angezeigt."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.skip-non-essential-warnings.title": {
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
"message": "Unwichtige Warnungen überspringen"
|
"message": "Unwichtige Warnungen überspringen"
|
||||||
@@ -141,10 +225,10 @@
|
|||||||
"message": "Authentifizierungsserver sind nicht erreichbar"
|
"message": "Authentifizierungsserver sind nicht erreichbar"
|
||||||
},
|
},
|
||||||
"app.browse.add-servers-to-instance": {
|
"app.browse.add-servers-to-instance": {
|
||||||
"message": "Server zu Instanz hinzufügen"
|
"message": "Server zur Instanz hinzufügen"
|
||||||
},
|
},
|
||||||
"app.browse.add-to-an-instance": {
|
"app.browse.add-to-an-instance": {
|
||||||
"message": "Zu Instanz hinzufügen"
|
"message": "Zu einer Instanz hinzufügen"
|
||||||
},
|
},
|
||||||
"app.browse.add-to-instance": {
|
"app.browse.add-to-instance": {
|
||||||
"message": "Zur Instanz hinzufügen"
|
"message": "Zur Instanz hinzufügen"
|
||||||
@@ -192,10 +276,10 @@
|
|||||||
"message": "Modpack exportieren"
|
"message": "Modpack exportieren"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
"app.export-modal.modpack-name-label": {
|
||||||
"message": "Modpackname"
|
"message": "Name des Modpacks"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Modpackname"
|
"message": "Name des Modpacks"
|
||||||
},
|
},
|
||||||
"app.export-modal.version-number-label": {
|
"app.export-modal.version-number-label": {
|
||||||
"message": "Versionsnummer"
|
"message": "Versionsnummer"
|
||||||
@@ -219,7 +303,7 @@
|
|||||||
"message": "Wird finalisiert"
|
"message": "Wird finalisiert"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Instanz wird vorbereitet"
|
"message": "Installation in Warteschlange"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Java wird vorbereitet"
|
"message": "Java wird vorbereitet"
|
||||||
@@ -231,7 +315,7 @@
|
|||||||
"message": "Java {version} wird extrahiert"
|
"message": "Java {version} wird extrahiert"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java.fetching-metadata": {
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
"message": "Java {version} wird heruntergeladen"
|
"message": "Java {version} wird abgerufen"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java.resolving": {
|
"app.install.phase.preparing_java.resolving": {
|
||||||
"message": "Java {version} wird vorbereitet"
|
"message": "Java {version} wird vorbereitet"
|
||||||
@@ -257,6 +341,36 @@
|
|||||||
"app.install.phase.running_loader_processors": {
|
"app.install.phase.running_loader_processors": {
|
||||||
"message": "Loader-Prozesse werden ausgeführt"
|
"message": "Loader-Prozesse werden ausgeführt"
|
||||||
},
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.added-label": {
|
||||||
|
"message": "Hinzugefügt"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-body": {
|
||||||
|
"message": "Deine lokale Instanz ist den Benutzern, mit denen du sie geteilt hast, voraus."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-header": {
|
||||||
|
"message": "Deine Änderungen wurden noch nicht geteilt"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publish-button": {
|
||||||
|
"message": "Update senden"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publishing-button": {
|
||||||
|
"message": "Wird gesendet..."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.removed-label": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-admonition-header": {
|
||||||
|
"message": "Update senden"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-description": {
|
||||||
|
"message": "Überprüfe die Inhaltsänderungen, die allen Nutzern dieser Instanz bereitgestellt werden."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-header": {
|
||||||
|
"message": "Änderungen überprüfen"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.reviewing-button": {
|
||||||
|
"message": "Wird überprüft..."
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Alle Daten deiner Instanz werden permanent gelöscht, einschließlich deiner Welten, Konfigurationen und allen installierten Inhalten."
|
"message": "Alle Daten deiner Instanz werden permanent gelöscht, einschließlich deiner Welten, Konfigurationen und allen installierten Inhalten."
|
||||||
},
|
},
|
||||||
@@ -293,6 +407,9 @@
|
|||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "Projekt"
|
"message": "Projekt"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.locked-content": {
|
||||||
|
"message": "Inhalte in gesperrten Instanzen können nicht geändert werden."
|
||||||
|
},
|
||||||
"app.instance.mods.project-was-added": {
|
"app.instance.mods.project-was-added": {
|
||||||
"message": "\"{name}\" wurde hinzugefügt"
|
"message": "\"{name}\" wurde hinzugefügt"
|
||||||
},
|
},
|
||||||
@@ -308,6 +425,102 @@
|
|||||||
"app.instance.mods.successfully-uploaded": {
|
"app.instance.mods.successfully-uploaded": {
|
||||||
"message": "Erfolgreich hochgeladen"
|
"message": "Erfolgreich hochgeladen"
|
||||||
},
|
},
|
||||||
|
"app.instance.share.empty.description": {
|
||||||
|
"message": "Du kannst diese Instanz mit deinen Freunden teilen!"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.heading": {
|
||||||
|
"message": "Keine Freunde eingeladen"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.invite-friends-button": {
|
||||||
|
"message": "Freunde einladen"
|
||||||
|
},
|
||||||
|
"app.instance.share.invite-modal.heading": {
|
||||||
|
"message": "{name} teilen"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-prefix": {
|
||||||
|
"message": "Du musst dich als"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-suffix": {
|
||||||
|
"message": "anmelden um diese Seite aufzurufen."
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.linked-account-fallback": {
|
||||||
|
"message": "das verknüpfte Konto"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.signed-out-heading": {
|
||||||
|
"message": "Nicht angemeldet"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.switch-account-button": {
|
||||||
|
"message": "Konto wechseln"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.wrong-account-heading": {
|
||||||
|
"message": "Falsches Konto"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-access": {
|
||||||
|
"message": "Diese Person wird für diese geteilte Instanz erhalten keine Updates mehr erhalten"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-installed-copy": {
|
||||||
|
"message": "Jede bereits installierte Kopie bleibt auf deren Gerät erhalten"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-invite-again": {
|
||||||
|
"message": "Du kannst diese Person später erneut einladen"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-last-user": {
|
||||||
|
"message": "Dies ist der letzte Benutzer, das Teilen wird für diese Instanz deaktiviert"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effects-label": {
|
||||||
|
"message": "Was passiert?"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.header": {
|
||||||
|
"message": "Zugriff widerrufen"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.remove-button": {
|
||||||
|
"message": "Zugriff widerrufen"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.user-avatar-alt": {
|
||||||
|
"message": "Avatar von {username}"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.warning-body": {
|
||||||
|
"message": "Falls du den Zugriff von {username} auf diese geteilte Instanz widerrufst, musst du diese Person erneut einladen, bevor diese Updates erhalten kann."
|
||||||
|
},
|
||||||
|
"app.instance.share.sign-in.button": {
|
||||||
|
"message": "Anmelden"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.body": {
|
||||||
|
"message": "Du musst die Verknüpfung zu diesem Modpack trennen, um deine Instanz zu teilen"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.header": {
|
||||||
|
"message": "Zum Teilen muss die Verknüpfung getrennt werden"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.body": {
|
||||||
|
"message": "Diese geteilte Instanz ist bereits als <bold>{instanceName}</bold> installiert. Möchtest du wirklich eine weitere Kopie installieren?"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.header": {
|
||||||
|
"message": "Geteilte Instanz bereits installiert"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.install-anyway": {
|
||||||
|
"message": "Trotzdem Installieren"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.instance": {
|
||||||
|
"message": "Instanz"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.fallback-username": {
|
||||||
|
"message": "das verknüpfte Konto"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.owner-admonition-body-v2": {
|
||||||
|
"message": "um diese geteilte Instanz zu verwalten. Du wirst keine Updates an Nutzer senden können."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.sign-in-as-label": {
|
||||||
|
"message": "Anmelden als"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.signed-out-header": {
|
||||||
|
"message": "Du musst dich bei Modrinth anmelden"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.user-admonition-body-v2": {
|
||||||
|
"message": "um Updates für diese geteilte Instanz zu erhalten."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.warning-header": {
|
||||||
|
"message": "Du nutzt das falsche Modrinth-Konto"
|
||||||
|
},
|
||||||
"app.instance.worlds.add-server": {
|
"app.instance.worlds.add-server": {
|
||||||
"message": "Server hinzufügen"
|
"message": "Server hinzufügen"
|
||||||
},
|
},
|
||||||
@@ -359,29 +572,89 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Durchsuche {count} Welten..."
|
"message": "Durchsuche {count} Welten..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
"app.modal.install-to-play.additional-context": {
|
||||||
"message": "Inhalte benötigt"
|
"message": "Zusätzlicher Kontext"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.additional-context-placeholder": {
|
||||||
|
"message": "Füge gegebenenfalls relevante Links und Bilder hinzu"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.content-you-are-reporting": {
|
||||||
|
"message": "Die Instanz, die du meldest"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.delete-instance": {
|
||||||
|
"message": "Instanz löschen"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.external-files-dont-install": {
|
||||||
|
"message": "Nicht Installieren"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Installieren zum Spielen"
|
"message": "Installieren zum Spielen"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Trotzdem Installieren"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Installieren"
|
"message": "Installieren"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Diese Einladung wurde von einem anderen Modrinth-Nutzer erstellt, nicht von Modrinth. Nimm nur Einladungen von Personen an, denen du vertraust."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# Mod} other {# Mods}}"
|
"message": "{count, plural, one {# Mod} other {# Mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.report-description": {
|
||||||
"message": "Benötigtes Modpack"
|
"message": "Nutze dieses Formular, um Instanzen zu melden, die möglicherweise gegen unsere <rules-link>Regeln</rules-link> oder <terms-link>Nutzungsbedingungen</terms-link> verstoßen."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
"app.modal.install-to-play.report-image-invalid-type": {
|
||||||
"message": "Dieser Server benötigt Mods zum Spielen. Klicke auf Installieren um die nötigen Dateien von Modrinth herunterzuladen und danach direkt dem Server beizutreten."
|
"message": "Datei ist kein zulässiger Bildtyp"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-image-too-large": {
|
||||||
|
"message": "Datei überschreitet die Größenbeschränkung von 1 MiB"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-legal-claims": {
|
||||||
|
"message": "Informationen zu DMCA-Meldungen oder anderen rechtlichen Forderungen findest du in unserer <copyright-link>Urheberrechtsrichtlinie</copyright-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason": {
|
||||||
|
"message": "Gegen welche Regel verstößt diese Instanz?"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.inappropriate": {
|
||||||
|
"message": "Unangemessen"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.malicious": {
|
||||||
|
"message": "Bösartig"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.spam": {
|
||||||
|
"message": "Spam"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-shared-instance-header": {
|
||||||
|
"message": "Geteilte Instanz melden"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-submitted": {
|
||||||
|
"message": "Meldung eingereicht"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-support-and-bugs": {
|
||||||
|
"message": "Wende dich bei Supportanfragen bitte an unser <support-link>Support-Team</support-link>. Um Fehler zu melden, öffne bitte ein <github-link>Issue auf GitHub</github-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
|
"message": "Eine Datei wird nur geprüft, wenn sie auf Modrinth veröffentlicht wird, unabhängig von ihrem Dateiformat (auch .mrpack)."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Geteilte Instanz"
|
"message": "Geteilte Instanz"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.shared-instance-content": {
|
||||||
"message": "Geteilte Serverinstanz"
|
"message": "Inhalte der geteilten Instanz"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "Diese geteilte Instanz enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
|
"message": "Dieses Server-Modpack enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Warnung vor unbekannten Dateien"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Nicht erkannte Dateien"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Inhalte ansehen"
|
"message": "Inhalte ansehen"
|
||||||
@@ -389,6 +662,21 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Aktualisieren zum Spielen"
|
"message": "Aktualisieren zum Spielen"
|
||||||
},
|
},
|
||||||
|
"app.modal.update-to-play.removed": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.server-modpack-unknown-files-description": {
|
||||||
|
"message": "Dieses Update eines Server-Modpacks enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-added-label": {
|
||||||
|
"message": "Hinzugefügt"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-removed-label": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "Dieses Update einer geteilten Instanz enthält Dateien, die nicht auf Modrinth veröffentlicht sind. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
||||||
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.update-required": {
|
||||||
"message": "Aktualisierung erforderlich"
|
"message": "Aktualisierung erforderlich"
|
||||||
},
|
},
|
||||||
@@ -398,11 +686,23 @@
|
|||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Dieses Projekt ist bereits installiert"
|
"message": "Dieses Projekt ist bereits installiert"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Version wechseln"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Zurück zum Entdecken"
|
"message": "Zurück zum Entdecken"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Inhalt in Instanz installieren"
|
"message": "Alle Versionen"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Im Browser herunterladen"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Wird installiert"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Bereits installiert"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Entwicklermodus aktiviert."
|
"message": "Entwicklermodus aktiviert."
|
||||||
@@ -410,6 +710,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "Lade v{version} herunter"
|
"message": "Lade v{version} herunter"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Werbung ermöglicht Modrinth und finanziert die Auszahlungen an die Ersteller. Unsere Partner speichern möglicherweise Cookies in der App oder greifen auf diese zu, um Werbung zu personalisieren und die Leistung zu messen. Du kannst dies unten deaktivieren oder deine Einstellungen verwalten."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Erscheinungsbild"
|
"message": "Erscheinungsbild"
|
||||||
},
|
},
|
||||||
@@ -452,6 +755,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Fehler bei der Verarbeitung der Datei"
|
"message": "Fehler bei der Verarbeitung der Datei"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Dieser Skin nutzt Funktionen aus dem {ears}-Mod"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Skin bearbeiten"
|
"message": "Skin bearbeiten"
|
||||||
},
|
},
|
||||||
@@ -524,6 +830,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -575,8 +884,14 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Skin-Auswahl"
|
"message": "Skin-Auswahl"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Deaktivieren"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Aktivieren"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App v{version} wurde heruntergeladen. Neu laden, um jetzt zu aktualisieren, oder automatisch aktualisieren, wenn du die Modrinth App schließt."
|
"message": "Modrinth App v{version} wurde heruntergeladen. Jetzt neu laden, um sofort zu aktualisieren, oder beim Schließen der Modrinth-App automatisch aktualisieren."
|
||||||
},
|
},
|
||||||
"app.update-popup.body.linux": {
|
"app.update-popup.body.linux": {
|
||||||
"message": "Modrinth App v{version} ist verfügbar. Verwende deinen Paketmanager, um die neuesten Funktionen und Fehlerbehebungen zu installieren!"
|
"message": "Modrinth App v{version} ist verfügbar. Verwende deinen Paketmanager, um die neuesten Funktionen und Fehlerbehebungen zu installieren!"
|
||||||
@@ -609,7 +924,7 @@
|
|||||||
"message": "example.modrinth.gg"
|
"message": "example.modrinth.gg"
|
||||||
},
|
},
|
||||||
"app.world.server-modal.select-an-option": {
|
"app.world.server-modal.select-an-option": {
|
||||||
"message": "Wählen eine Option"
|
"message": "Wähle eine Option"
|
||||||
},
|
},
|
||||||
"app.world.world-item.incompatible-version": {
|
"app.world.world-item.incompatible-version": {
|
||||||
"message": "Inkompatible Version {version}"
|
"message": "Inkompatible Version {version}"
|
||||||
@@ -623,6 +938,39 @@
|
|||||||
"app.world.world-item.players-online": {
|
"app.world.world-item.players-online": {
|
||||||
"message": "{count} online"
|
"message": "{count} online"
|
||||||
},
|
},
|
||||||
|
"content.shared-instance.change-version-body": {
|
||||||
|
"message": "Das Ändern der Version wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können diese wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-bulk-body": {
|
||||||
|
"message": "Einige ausgewählte Projekte sind Teil der geteilten Instanz. Wenn du diese löschst, wirkt sich dies nur auf deine lokale Kopie aus, und zukünftige Updates der geteilten Instanz können diese möglicherweise wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-button": {
|
||||||
|
"message": "Trotzdem löschen"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-many-button": {
|
||||||
|
"message": "{count, plural, one {# Projekt} other {# Projekte}} trotzdem löschen"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-single-body": {
|
||||||
|
"message": "Das Löschen wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können dies wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-bulk-body": {
|
||||||
|
"message": "Einige ausgewählte Projekte sind Teil der geteilten Instanz. Wenn du diese deaktivierst, wirkt sich dies nur auf deine lokale Kopie aus, und zukünftige Updates der geteilten Instanz können diese möglicherweise wieder aktivieren, wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-button": {
|
||||||
|
"message": "Trotzdem deaktivieren"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-many-button": {
|
||||||
|
"message": "{count, plural, one {# Projekt} other {# Projekte}} trotzdem deaktivieren"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-single-body": {
|
||||||
|
"message": "Das Deaktivieren wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können dies wieder aktivieren, wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.unlink-body": {
|
||||||
|
"message": "Das Aufheben der Verknüpfung wirkt sich nur auf deine lokale Kopie aus. Zukünftige Updates der geteilten Instanz können diese wiederherstellen oder erneut ändern."
|
||||||
|
},
|
||||||
|
"content.shared-instance.warning-header": {
|
||||||
|
"message": "Dies ist Teil der geteilten Instanz"
|
||||||
|
},
|
||||||
"friends.action.add-friend": {
|
"friends.action.add-friend": {
|
||||||
"message": "Freund hinzufügen"
|
"message": "Freund hinzufügen"
|
||||||
},
|
},
|
||||||
@@ -686,6 +1034,75 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Melde dich bei einem Modrinth-Konto an</link>, um Freunde hinzuzufügen und zu sehen, was sie gerade spielen!"
|
"message": "<link>Melde dich bei einem Modrinth-Konto an</link>, um Freunde hinzuzufügen und zu sehen, was sie gerade spielen!"
|
||||||
},
|
},
|
||||||
|
"installation-settings.shared-instance.linked-title": {
|
||||||
|
"message": "Verknüpfte geteilte Instanz"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.title": {
|
||||||
|
"message": "Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-button": {
|
||||||
|
"message": "Geteilte Instanz trennen"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-description": {
|
||||||
|
"message": "Trenne diese lokale Instanz von zukünftigen geteilten Updates."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlinking-button": {
|
||||||
|
"message": "Wird getrennt..."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-button": {
|
||||||
|
"message": "Geteilte Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-description": {
|
||||||
|
"message": "Entferne diese geteilte Instanz von Modrinth und sende keine Updates mehr an Personen, die sie nutzen. Deine lokale Instanz ist davon nicht betroffen."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublishing-button": {
|
||||||
|
"message": "Wird zurückgezogen..."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "Dies betrifft nur deine lokale Instanz. Deine installierten Inhalte bleiben auf diesem Gerät, und die freigegebene Instanz sowie andere Benutzer, die diese verwenden, sind davon nicht betroffen."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Geteilte Instanz trennen"
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.header": {
|
||||||
|
"message": "Geteilte Instanz trennen"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "Dadurch wird die geteilte Instanz von den Servern von Modrinth gelöscht. Personen, die diese in der Modrinth-App nutzen, erhalten keine Updates mehr, aber deine lokale Instanz und dessen Inhalte bleiben auf diesem Gerät erhalten."
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Geteilte Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.header": {
|
||||||
|
"message": "Geteilte Instanz zurückziehen"
|
||||||
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Verknüpfung erstellen"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Modpack exportieren"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Instanz starten"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "Weitere Aktionen"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Ordner öffnen"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Reparieren"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Instanz-Einstellungen"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Wird gestartet..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Wird gestoppt..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Hinzufügen und spielen"
|
"message": "Hinzufügen und spielen"
|
||||||
},
|
},
|
||||||
@@ -728,6 +1145,15 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Speichern unter..."
|
"message": "Speichern unter..."
|
||||||
},
|
},
|
||||||
|
"instance.locked.delete-button": {
|
||||||
|
"message": "Instanz löschen"
|
||||||
|
},
|
||||||
|
"instance.locked.play-tooltip": {
|
||||||
|
"message": "Diese Instanz wurde gesperrt"
|
||||||
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Noch nie gespielt"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Adresse"
|
"message": "Adresse"
|
||||||
},
|
},
|
||||||
@@ -863,6 +1289,9 @@
|
|||||||
"instance.settings.tabs.installation.loader-version": {
|
"instance.settings.tabs.installation.loader-version": {
|
||||||
"message": "{loader} Version"
|
"message": "{loader} Version"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.installation.locked": {
|
||||||
|
"message": "Installationseinstellungen sind nicht verfügbar, solange diese Instanz gesperrt ist."
|
||||||
|
},
|
||||||
"instance.settings.tabs.java": {
|
"instance.settings.tabs.java": {
|
||||||
"message": "Java und Arbeitsspeicher"
|
"message": "Java und Arbeitsspeicher"
|
||||||
},
|
},
|
||||||
@@ -902,6 +1331,9 @@
|
|||||||
"instance.settings.tabs.java.java-path-placeholder": {
|
"instance.settings.tabs.java.java-path-placeholder": {
|
||||||
"message": "/pfad/zu/java"
|
"message": "/pfad/zu/java"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.sharing": {
|
||||||
|
"message": "Teilen"
|
||||||
|
},
|
||||||
"instance.settings.tabs.window": {
|
"instance.settings.tabs.window": {
|
||||||
"message": "Fenster"
|
"message": "Fenster"
|
||||||
},
|
},
|
||||||
@@ -932,6 +1364,57 @@
|
|||||||
"instance.settings.tabs.window.width.enter": {
|
"instance.settings.tabs.window.width.enter": {
|
||||||
"message": "Breite eingeben..."
|
"message": "Breite eingeben..."
|
||||||
},
|
},
|
||||||
|
"instance.shared-instance.error.title": {
|
||||||
|
"message": "Etwas ist schiefgelaufen"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.owner-tooltip": {
|
||||||
|
"message": "Der Inhalt dieser Instanz wird mit anderen Benutzern geteilt."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.added-label": {
|
||||||
|
"message": "Hinzugefügt"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.admonition-header": {
|
||||||
|
"message": "Update an Spieler senden"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.config-title-v2": {
|
||||||
|
"message": "Konfigurationsdateien auswählen"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.description": {
|
||||||
|
"message": "Überprüfe die Inhaltsänderungen und wähle Konfigurationsdateien aus, die in diesem Update enthalten sein sollen."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.header": {
|
||||||
|
"message": "Änderungen überprüfen"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.publish-button": {
|
||||||
|
"message": "Update senden"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.removed-label": {
|
||||||
|
"message": "Entfernt"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.tooltip": {
|
||||||
|
"message": "Der Inhalt dieser Instanz wird von jemand anderes verwaltet."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.access-revoked-text": {
|
||||||
|
"message": "Dein Zugriff auf die geteilte Instanz wurde widerrufen. Diese Instanz ist weiterhin verfügbar, ist jedoch nicht mehr verknüpft und erhält keine Updates mehr."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.deleted-text": {
|
||||||
|
"message": "Die primäre Instanz wurde gelöscht. Diese Instanz ist weiterhin verfügbar, ist jedoch nicht mehr verknüpft und erhält keine Updates mehr."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-text": {
|
||||||
|
"message": "Diese geteilte Instanz wurde vom Inhaltsmoderationsteam gesperrt. Sie erhält keine Updates von der primären Instanz mehr und kann nicht mehr gespielt werden."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-title": {
|
||||||
|
"message": "Instanz gesperrt"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.manager-fallback": {
|
||||||
|
"message": "der Instanzmanager"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.text": {
|
||||||
|
"message": "Deine lokale Instanz ist weiterhin verfügbar, ist jedoch nicht mehr verknüpft und erhält keine Updates mehr."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.title": {
|
||||||
|
"message": "Geteilte Instanz nicht mehr verfügbar"
|
||||||
|
},
|
||||||
"instance.worlds.a_minecraft_server": {
|
"instance.worlds.a_minecraft_server": {
|
||||||
"message": "Ein Minecraft-Server"
|
"message": "Ein Minecraft-Server"
|
||||||
},
|
},
|
||||||
@@ -995,6 +1478,63 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Bei Minecraft anmelden"
|
"message": "Bei Minecraft anmelden"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Du benötigst ein Microsoft-Konto, welches Minecraft besitzt, bevor du das Spiel starten und spielen kannst."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Bei einem Microsoft-Konto anmelden"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Du hast kein Konto?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Minecraft holen"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Hilfe erhalten"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft erforderlich"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Bei Microsoft anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.browser-description": {
|
||||||
|
"message": "Ein neuer Tab zum Anmelden wurde geöffnet. Schließe die Anmeldung dort ab und kehren anschließend zur App zurück."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.cancel-button": {
|
||||||
|
"message": "Abbrechen"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.continue-in-browser-heading": {
|
||||||
|
"message": "Im Browser fortfahren"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.create-account-button": {
|
||||||
|
"message": "Ein Konto erstellen"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.description": {
|
||||||
|
"message": "Du musst dich bei deinem Modrinth-Konto anmelden, bevor du diese Funktion nutzen kannst."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.header": {
|
||||||
|
"message": "Konto erforderlich"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.open-browser-again-button": {
|
||||||
|
"message": "Browser erneut öffnen"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-button": {
|
||||||
|
"message": "Bei Modrinth anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-heading": {
|
||||||
|
"message": "Bei einem Modrinth-Konto anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.signing-in-header": {
|
||||||
|
"message": "Anmelden"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.support-prompt": {
|
||||||
|
"message": "Hast du Probleme bei der Anmeldung? <support>Hilfe erhalten</support>"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.waiting-for-browser": {
|
||||||
|
"message": "Warte auf Bestätigung durch den Browser..."
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Von der Instanz vorgegeben"
|
"message": "Von der Instanz vorgegeben"
|
||||||
},
|
},
|
||||||
@@ -1018,26 +1558,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader vom Server vorgegeben"
|
"message": "Loader vom Server vorgegeben"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Eine Datei wird nur geprüft, wenn sie auf Modrinth hochgeladen wird, unabhängig von ihrem Dateiformat (auch .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Diese Warnung nicht mehr anzeigen"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Installation bestätigen"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Trotzdem installieren"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Schadsoftware wird häufig über Modpack-Dateien verbreitet, indem diese auf Plattformen wie Discord geteilt werden."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Wir konnten diese Datei auf Modrinth nicht finden. Wir empfehlen dringend, nur Dateien aus vertrauenswürdigen Quellen zu installieren."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Warnung vor unbekannter Datei"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,6 +89,9 @@
|
|||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Unknown instance"
|
"message": "Unknown instance"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.updating-shared-content": {
|
||||||
|
"message": "Updating shared content"
|
||||||
|
},
|
||||||
"app.action-bar.installs": {
|
"app.action-bar.installs": {
|
||||||
"message": "Installs"
|
"message": "Installs"
|
||||||
},
|
},
|
||||||
@@ -125,6 +128,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "View logs"
|
"message": "View logs"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Accept all"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Ads make Modrinth possible and fund creator payouts. Our partners may store or access cookies in the app to personalize ads and measure performance."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Manage preferences"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Reject all"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Your privacy and how ads support Modrinth"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Enables advanced rendering such as blur effects that may cause performance issues without hardware-accelerated rendering."
|
"message": "Enables advanced rendering such as blur effects that may cause performance issues without hardware-accelerated rendering."
|
||||||
},
|
},
|
||||||
@@ -323,6 +341,36 @@
|
|||||||
"app.install.phase.running_loader_processors": {
|
"app.install.phase.running_loader_processors": {
|
||||||
"message": "Running loader processors"
|
"message": "Running loader processors"
|
||||||
},
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.added-label": {
|
||||||
|
"message": "Added"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-body": {
|
||||||
|
"message": "Your local instance is ahead of the users you've shared it with."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-header": {
|
||||||
|
"message": "Your changes haven't been shared yet"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publish-button": {
|
||||||
|
"message": "Push update"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publishing-button": {
|
||||||
|
"message": "Pushing..."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.removed-label": {
|
||||||
|
"message": "Removed"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-admonition-header": {
|
||||||
|
"message": "Push update"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-description": {
|
||||||
|
"message": "Review the content changes that will be shared with everyone using this instance."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-header": {
|
||||||
|
"message": "Review changes"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.reviewing-button": {
|
||||||
|
"message": "Reviewing..."
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "All data for your instance will be permanently deleted, including your worlds, configs, and all installed content."
|
"message": "All data for your instance will be permanently deleted, including your worlds, configs, and all installed content."
|
||||||
},
|
},
|
||||||
@@ -359,6 +407,9 @@
|
|||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "project"
|
"message": "project"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.locked-content": {
|
||||||
|
"message": "Content in locked instances cannot be changed."
|
||||||
|
},
|
||||||
"app.instance.mods.project-was-added": {
|
"app.instance.mods.project-was-added": {
|
||||||
"message": "\"{name}\" was added"
|
"message": "\"{name}\" was added"
|
||||||
},
|
},
|
||||||
@@ -374,6 +425,102 @@
|
|||||||
"app.instance.mods.successfully-uploaded": {
|
"app.instance.mods.successfully-uploaded": {
|
||||||
"message": "Successfully uploaded"
|
"message": "Successfully uploaded"
|
||||||
},
|
},
|
||||||
|
"app.instance.share.empty.description": {
|
||||||
|
"message": "You can share this instance with your friends!"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.heading": {
|
||||||
|
"message": "No friends invited"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.invite-friends-button": {
|
||||||
|
"message": "Invite friends"
|
||||||
|
},
|
||||||
|
"app.instance.share.invite-modal.heading": {
|
||||||
|
"message": "Share {name}"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-prefix": {
|
||||||
|
"message": "You need to sign in as"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-suffix": {
|
||||||
|
"message": "to access this page."
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.linked-account-fallback": {
|
||||||
|
"message": "the linked account"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.signed-out-heading": {
|
||||||
|
"message": "Not signed in"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.switch-account-button": {
|
||||||
|
"message": "Switch account"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.wrong-account-heading": {
|
||||||
|
"message": "Wrong account"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-access": {
|
||||||
|
"message": "They will no longer receive updates for this shared instance"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-installed-copy": {
|
||||||
|
"message": "Any copy they already installed will stay on their device"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-invite-again": {
|
||||||
|
"message": "You can invite them again later"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-last-user": {
|
||||||
|
"message": "This is the last user, sharing will be turned off for this instance"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effects-label": {
|
||||||
|
"message": "What happens?"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.header": {
|
||||||
|
"message": "Revoke access"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.remove-button": {
|
||||||
|
"message": "Revoke access"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.user-avatar-alt": {
|
||||||
|
"message": "{username}'s avatar"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.warning-body": {
|
||||||
|
"message": "If you revoke {username}'s access to this shared instance, you'll need to invite them again before they can receive updates."
|
||||||
|
},
|
||||||
|
"app.instance.share.sign-in.button": {
|
||||||
|
"message": "Sign in"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.body": {
|
||||||
|
"message": "You must unlink this modpack to share your instance"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.header": {
|
||||||
|
"message": "Sharing requires unlinking"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.body": {
|
||||||
|
"message": "This shared instance is already installed as <bold>{instanceName}</bold>. Are you sure you want to install another copy?"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.header": {
|
||||||
|
"message": "Shared instance already installed"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.install-anyway": {
|
||||||
|
"message": "Install anyway"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.instance": {
|
||||||
|
"message": "Instance"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.fallback-username": {
|
||||||
|
"message": "the linked account"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.owner-admonition-body-v2": {
|
||||||
|
"message": "to manage this shared instance. You won't be able to push updates to users."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.sign-in-as-label": {
|
||||||
|
"message": "Sign in as"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.signed-out-header": {
|
||||||
|
"message": "You need to sign in to Modrinth"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.user-admonition-body-v2": {
|
||||||
|
"message": "to receive updates for this shared instance."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.warning-header": {
|
||||||
|
"message": "You are using the wrong Modrinth account"
|
||||||
|
},
|
||||||
"app.instance.worlds.add-server": {
|
"app.instance.worlds.add-server": {
|
||||||
"message": "Add server"
|
"message": "Add server"
|
||||||
},
|
},
|
||||||
@@ -425,29 +572,89 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Search {count} worlds..."
|
"message": "Search {count} worlds..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
"app.modal.install-to-play.additional-context": {
|
||||||
"message": "Content required"
|
"message": "Additional context"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.additional-context-placeholder": {
|
||||||
|
"message": "Include links and images if possible and relevant"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.content-you-are-reporting": {
|
||||||
|
"message": "Instance you’re reporting"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.delete-instance": {
|
||||||
|
"message": "Delete instance"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.external-files-dont-install": {
|
||||||
|
"message": "Don't install"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Install to play"
|
"message": "Install to play"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Install anyway"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Install"
|
"message": "Install"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "This invite was created by another Modrinth user, not Modrinth. Only accept invites from people you trust."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} other {# mods}}"
|
"message": "{count, plural, one {# mod} other {# mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.report-description": {
|
||||||
"message": "Required modpack"
|
"message": "Use this form to report instances that may violate our <rules-link>Rules</rules-link> or <terms-link>Terms of Use</terms-link>."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
"app.modal.install-to-play.report-image-invalid-type": {
|
||||||
"message": "This server requires mods to play. Click Install to set up the required files from Modrinth, then launch directly into the server."
|
"message": "File is not an accepted image type"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-image-too-large": {
|
||||||
|
"message": "File exceeds the 1 MiB size limit"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-legal-claims": {
|
||||||
|
"message": "For DMCA notices or other legal claims, see our <copyright-link>Copyright Policy</copyright-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason": {
|
||||||
|
"message": "Which rule does this instance violate?"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.inappropriate": {
|
||||||
|
"message": "Inappropriate"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.malicious": {
|
||||||
|
"message": "Malicious"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.spam": {
|
||||||
|
"message": "Spam"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-shared-instance-header": {
|
||||||
|
"message": "Report shared instance"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-submitted": {
|
||||||
|
"message": "Report submitted"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-support-and-bugs": {
|
||||||
|
"message": "For support requests, contact our <support-link>support team</support-link>. For bug reports, open a <github-link>GitHub issue</github-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
|
"message": "A file is only reviewed if it’s published to Modrinth, regardless of its file format (including .mrpack)."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Shared instance"
|
"message": "Shared instance"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.shared-instance-content": {
|
||||||
"message": "Shared server instance"
|
"message": "Shared instance content"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "This shared instance contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
|
"message": "This server modpack contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Unknown files warning"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Unrecognized files"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "View contents"
|
"message": "View contents"
|
||||||
@@ -455,11 +662,26 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Update to play"
|
"message": "Update to play"
|
||||||
},
|
},
|
||||||
|
"app.modal.update-to-play.removed": {
|
||||||
|
"message": "Removed"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.server-modpack-unknown-files-description": {
|
||||||
|
"message": "This server modpack update contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust."
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-added-label": {
|
||||||
|
"message": "Added"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-removed-label": {
|
||||||
|
"message": "Removed"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "This shared instance update contains files that aren’t published on Modrinth. We strongly recommend only installing files from sources you trust."
|
||||||
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.update-required": {
|
||||||
"message": "Update required"
|
"message": "Update required"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required-description": {
|
"app.modal.update-to-play.update-required-description": {
|
||||||
"message": "An update is required to play {name}. Please update to the latest version to launch the game."
|
"message": "An update is required to play {name}. Please update to latest version to launch the game."
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "This project is already installed"
|
"message": "This project is already installed"
|
||||||
@@ -470,9 +692,6 @@
|
|||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Back to discover"
|
"message": "Back to discover"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
|
||||||
"message": "Install content to instance"
|
|
||||||
},
|
|
||||||
"app.project.version.all-versions": {
|
"app.project.version.all-versions": {
|
||||||
"message": "All versions"
|
"message": "All versions"
|
||||||
},
|
},
|
||||||
@@ -491,6 +710,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "Downloading v{version}"
|
"message": "Downloading v{version}"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Ads make Modrinth possible and fund creator payouts. Our partners may store or access cookies in the app to personalize ads and measure performance. You can opt out or manage your preferences below."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Appearance"
|
"message": "Appearance"
|
||||||
},
|
},
|
||||||
@@ -533,6 +755,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Error processing file"
|
"message": "Error processing file"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "This skin uses features from the {ears} mod"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Edit skin"
|
"message": "Edit skin"
|
||||||
},
|
},
|
||||||
@@ -659,6 +884,12 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Skin selector"
|
"message": "Skin selector"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Toggle off"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Toggle on"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App."
|
"message": "Modrinth App v{version} has finished downloading. Reload to update now, or automatically when you close Modrinth App."
|
||||||
},
|
},
|
||||||
@@ -707,6 +938,39 @@
|
|||||||
"app.world.world-item.players-online": {
|
"app.world.world-item.players-online": {
|
||||||
"message": "{count} online"
|
"message": "{count} online"
|
||||||
},
|
},
|
||||||
|
"content.shared-instance.change-version-body": {
|
||||||
|
"message": "Changing the version only changes your local copy. Future shared instance updates may restore or change it again."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-bulk-body": {
|
||||||
|
"message": "Some selected projects are part of the shared instance. Deleting them only changes your local copy, and future shared instance updates may restore or change them again."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-button": {
|
||||||
|
"message": "Delete anyway"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-many-button": {
|
||||||
|
"message": "Delete {count, number} projects anyway"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-single-body": {
|
||||||
|
"message": "Deleting it only changes your local copy. Future shared instance updates may restore or change it again."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-bulk-body": {
|
||||||
|
"message": "Some selected projects are part of the shared instance. Disabling them only changes your local copy, and future shared instance updates may re-enable, restore, or change them again."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-button": {
|
||||||
|
"message": "Disable anyway"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-many-button": {
|
||||||
|
"message": "Disable {count, number} projects anyway"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-single-body": {
|
||||||
|
"message": "Disabling it only changes your local copy. Future shared instance updates may re-enable, restore, or change it again."
|
||||||
|
},
|
||||||
|
"content.shared-instance.unlink-body": {
|
||||||
|
"message": "Unlinking only changes your local copy. Future shared instance updates may restore or change it again."
|
||||||
|
},
|
||||||
|
"content.shared-instance.warning-header": {
|
||||||
|
"message": "This is part of the shared instance"
|
||||||
|
},
|
||||||
"friends.action.add-friend": {
|
"friends.action.add-friend": {
|
||||||
"message": "Add a friend"
|
"message": "Add a friend"
|
||||||
},
|
},
|
||||||
@@ -770,6 +1034,75 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Sign in to a Modrinth account</link> to add friends and see what they're playing!"
|
"message": "<link>Sign in to a Modrinth account</link> to add friends and see what they're playing!"
|
||||||
},
|
},
|
||||||
|
"installation-settings.shared-instance.linked-title": {
|
||||||
|
"message": "Linked shared instance"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.title": {
|
||||||
|
"message": "Unpublish instance"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-button": {
|
||||||
|
"message": "Unlink shared instance"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-description": {
|
||||||
|
"message": "Disconnect this local instance from future shared updates."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlinking-button": {
|
||||||
|
"message": "Unlinking..."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-button": {
|
||||||
|
"message": "Unpublish shared instance"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-description": {
|
||||||
|
"message": "Remove this shared instance from Modrinth and stop sending updates to anyone using it. Your local instance will not be affected."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublishing-button": {
|
||||||
|
"message": "Unpublishing..."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "This only affects your local instance. Your installed content will stay on this device, and the shared instance and other people using it will not be affected."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Unlinking shared instance"
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.header": {
|
||||||
|
"message": "Unlink shared instance"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "This deletes the shared instance from Modrinth's servers. People using it in the Modrinth App will stop receiving updates, but your local instance and its content will stay on this device."
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Unpublishing shared instance"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.header": {
|
||||||
|
"message": "Unpublish shared instance"
|
||||||
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Create shortcut"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Export modpack"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Launch instance"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "More actions"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Open folder"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Repair"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Instance settings"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Starting..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Stopping..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Add and play"
|
"message": "Add and play"
|
||||||
},
|
},
|
||||||
@@ -812,6 +1145,15 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Save as..."
|
"message": "Save as..."
|
||||||
},
|
},
|
||||||
|
"instance.locked.delete-button": {
|
||||||
|
"message": "Delete instance"
|
||||||
|
},
|
||||||
|
"instance.locked.play-tooltip": {
|
||||||
|
"message": "This instance has been locked"
|
||||||
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Never played"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Address"
|
"message": "Address"
|
||||||
},
|
},
|
||||||
@@ -947,6 +1289,9 @@
|
|||||||
"instance.settings.tabs.installation.loader-version": {
|
"instance.settings.tabs.installation.loader-version": {
|
||||||
"message": "{loader} version"
|
"message": "{loader} version"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.installation.locked": {
|
||||||
|
"message": "Installation settings are unavailable while this instance is locked."
|
||||||
|
},
|
||||||
"instance.settings.tabs.java": {
|
"instance.settings.tabs.java": {
|
||||||
"message": "Java and memory"
|
"message": "Java and memory"
|
||||||
},
|
},
|
||||||
@@ -986,6 +1331,9 @@
|
|||||||
"instance.settings.tabs.java.java-path-placeholder": {
|
"instance.settings.tabs.java.java-path-placeholder": {
|
||||||
"message": "/path/to/java"
|
"message": "/path/to/java"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.sharing": {
|
||||||
|
"message": "Sharing"
|
||||||
|
},
|
||||||
"instance.settings.tabs.window": {
|
"instance.settings.tabs.window": {
|
||||||
"message": "Window"
|
"message": "Window"
|
||||||
},
|
},
|
||||||
@@ -1016,6 +1364,57 @@
|
|||||||
"instance.settings.tabs.window.width.enter": {
|
"instance.settings.tabs.window.width.enter": {
|
||||||
"message": "Enter width..."
|
"message": "Enter width..."
|
||||||
},
|
},
|
||||||
|
"instance.shared-instance.error.title": {
|
||||||
|
"message": "Something has gone wrong"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.owner-tooltip": {
|
||||||
|
"message": "This instance's content is being shared to other users."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.added-label": {
|
||||||
|
"message": "Added"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.admonition-header": {
|
||||||
|
"message": "Push update to players"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.config-title-v2": {
|
||||||
|
"message": "Select config files"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.description": {
|
||||||
|
"message": "Review the content changes and choose any config files to include in this update."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.header": {
|
||||||
|
"message": "Review changes"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.publish-button": {
|
||||||
|
"message": "Push update"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.removed-label": {
|
||||||
|
"message": "Removed"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.tooltip": {
|
||||||
|
"message": "This instance's content is being managed by someone else."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.access-revoked-text": {
|
||||||
|
"message": "Your access to the shared instance was revoked. This instance is still available, but it is no longer linked and will no longer receive updates."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.deleted-text": {
|
||||||
|
"message": "The primary instance was deleted. This instance is still available, but it is no longer linked and will no longer receive updates."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-text": {
|
||||||
|
"message": "This shared instance was locked by the Content Moderation team. It will no longer receive updates from the primary instance and cannot be played."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-title": {
|
||||||
|
"message": "Instance locked"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.manager-fallback": {
|
||||||
|
"message": "the instance manager"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.text": {
|
||||||
|
"message": "Your local instance is still available, but it is no longer linked and won't receive updates."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.title": {
|
||||||
|
"message": "Shared instance no longer available"
|
||||||
|
},
|
||||||
"instance.worlds.a_minecraft_server": {
|
"instance.worlds.a_minecraft_server": {
|
||||||
"message": "A Minecraft Server"
|
"message": "A Minecraft Server"
|
||||||
},
|
},
|
||||||
@@ -1079,6 +1478,63 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Sign in to Minecraft"
|
"message": "Sign in to Minecraft"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "You need a Microsoft account that owns Minecraft before you can launch and play."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Sign in to a Microsoft account"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Don’t have an account?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Get Minecraft"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Get support"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft required"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Sign in to Microsoft"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.browser-description": {
|
||||||
|
"message": "A new tab opened to sign in. Complete the sign in there, then return to the app."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.cancel-button": {
|
||||||
|
"message": "Cancel"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.continue-in-browser-heading": {
|
||||||
|
"message": "Continue in your browser"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.create-account-button": {
|
||||||
|
"message": "Create an account"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.description": {
|
||||||
|
"message": "You'll need to sign into your Modrinth account before you can use this feature."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.header": {
|
||||||
|
"message": "Account required"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.open-browser-again-button": {
|
||||||
|
"message": "Open browser again"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-button": {
|
||||||
|
"message": "Sign in to Modrinth"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-heading": {
|
||||||
|
"message": "Sign in to a Modrinth account"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.signing-in-header": {
|
||||||
|
"message": "Signing in"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.support-prompt": {
|
||||||
|
"message": "Having trouble signing in? <support>Get support</support>"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.waiting-for-browser": {
|
||||||
|
"message": "Waiting for browser confirmation..."
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Provided by the instance"
|
"message": "Provided by the instance"
|
||||||
},
|
},
|
||||||
@@ -1102,26 +1558,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader is provided by the server"
|
"message": "Loader is provided by the server"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "A file is only reviewed if it’s uploaded to Modrinth, regardless of its file format (including .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Don't show this warning again"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Confirm installation"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Install anyway"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Malware is often distributed through modpack files by sharing them on platforms like Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "We couldn't find this file on Modrinth. We strongly recommend only installing files from sources you trust."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Unknown file warning"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Ocultar más instancias en ejecución"
|
"message": "Ocultar más instancias en ejecución"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Copiado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Copiar detalles"
|
||||||
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Descartar"
|
"message": "Descartar"
|
||||||
},
|
},
|
||||||
@@ -20,6 +26,66 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Reintentar"
|
"message": "Reintentar"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Cancelado debido al cierre de la aplicación"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "No se pudo leer el modpack"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Cancelado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "La limpieza no se completó"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "No se pudieron descargar los archivos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "El archivo descargado está dañado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "No se pudieron guardar los archivos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "No se pudo completar la descarga"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "No se pudo encontrar la instancia"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "La ruta del archivo no es válida"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Los datos del modpack no son válidos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Los archivos del modpack tienen metadatos no válidos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "No se pudo completar la configuración de Java"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "No se pudo configurar el cargador"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "No se pudieron actualizar los datos locales"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "La instalación de Minecraft falló"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "No pude comunicarme con Modrinth"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "No tiene permiso para escribir"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "No se pudo descargar el modpack"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Algo salió mal"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Instancia desconocida"
|
"message": "Instancia desconocida"
|
||||||
},
|
},
|
||||||
@@ -168,7 +234,7 @@
|
|||||||
"message": "Descubrir servidores"
|
"message": "Descubrir servidores"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "Ocultar servidores ya añadidos"
|
"message": "Ocultar los servidores ya agregados"
|
||||||
},
|
},
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacks"
|
"message": "Modpacks"
|
||||||
@@ -219,7 +285,7 @@
|
|||||||
"message": "Finalizando"
|
"message": "Finalizando"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Preparando la instancia"
|
"message": "En cola para instalarse"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Preparando Java"
|
"message": "Preparando Java"
|
||||||
@@ -359,29 +425,35 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Buscar en {count} mundos..."
|
"message": "Buscar en {count} mundos..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Contenido requerido"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Instalar para jugar"
|
"message": "Instalar para jugar"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Instalar de todos modos"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Instalar"
|
"message": "Instalar"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Esta invitación la creó otro usuario de Modrinth, no Modrinth. Solo acepta invitaciones de personas en las que confíes."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} other {# mods}}"
|
"message": "{count, plural, one {# mod} other {# mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "Modpack requerido"
|
"message": "Un archivo solo se revisa si se publica en Modrinth, sin importar su formato (incluido el .mrpack)."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Este servidor requiere mods para poder jugar. Haz clic en Instalar para configurar los archivos requeridos desde Modrinth, después se ejecutará para entrar directamente al servidor."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Instancia compartida"
|
"message": "Instancia compartida"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "Instancia de servidor compartida"
|
"message": "Este modpack para servidor contiene archivos que no están publicados en Modrinth. Recomendamos encarecidamente instalar únicamente archivos de fuentes de confianza."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Advertencia sobre archivos desconocidos"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Archivos no reconocidos"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Ver contenidos"
|
"message": "Ver contenidos"
|
||||||
@@ -389,20 +461,29 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Actualizar para jugar"
|
"message": "Actualizar para jugar"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "Actualización requerida"
|
"message": "Eliminado"
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Se requiere una actualización para jugar {name}. Por favor, actualiza a la versión más reciente para iniciar el juego."
|
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Este proyecto ya está instalado"
|
"message": "Este proyecto ya está instalado"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Cambiar versión"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Volver al explorador"
|
"message": "Volver al explorador"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Instalar contenido a la instancia"
|
"message": "Todas las versiones"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Descargar en el navegador"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Instalando"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Ya instalado"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Modo desarrollador activado."
|
"message": "Modo desarrollador activado."
|
||||||
@@ -524,6 +605,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Constructores y Biomas"
|
"message": "Constructores y Biomas"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Caos al cubo"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Persigue los Cielos"
|
"message": "Persigue los Cielos"
|
||||||
},
|
},
|
||||||
@@ -1018,26 +1102,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "El loader es proporcionado por el servidor"
|
"message": "El loader es proporcionado por el servidor"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Un archivo solo es revisado si es subido a Modrinth, independientemente de su formato de archivo (incluyendo .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "No volver a mostrar esta advertencia"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Confirmar instalación"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Instalar de todos modos"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "El malware a menudo es distribuido mediante modpacks compartidos en aplicaciones como Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "No pudimos encontrar este archivo en Modrinth. Recomendamos solo instalar archivos de sitios de confianza."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Advertencia de archivo desconocido"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,18 @@
|
|||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Descartar"
|
"message": "Descartar"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "Abrir instancia"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "Reintentar"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "Instancia desconocida"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "Instalaciones"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Establecer como instancia principal"
|
"message": "Establecer como instancia principal"
|
||||||
},
|
},
|
||||||
@@ -104,6 +116,12 @@
|
|||||||
"app.appearance-settings.show-play-time.title": {
|
"app.appearance-settings.show-play-time.title": {
|
||||||
"message": "Mostrar tiempo de juego"
|
"message": "Mostrar tiempo de juego"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "Automáticamente omite confirmaciones de bajo riesgo como modpacks duplicados, eliminación de contenido normal, actualizaciones masivas, desvinculando modpacks, y mensajes de reparación. Advertencias importantes seguirán siendo mostradas."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "Omitir advertencias no esenciales"
|
||||||
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "Activa la posibilidad de alternar la barra lateral."
|
"message": "Activa la posibilidad de alternar la barra lateral."
|
||||||
},
|
},
|
||||||
@@ -149,9 +167,6 @@
|
|||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Descubrir servidores"
|
"message": "Descubrir servidores"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
|
||||||
"message": "Ocultar servidores ya añadidos"
|
|
||||||
},
|
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacks"
|
"message": "Modpacks"
|
||||||
},
|
},
|
||||||
@@ -254,9 +269,6 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Buscar {count} mundos..."
|
"message": "Buscar {count} mundos..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Contenido obligatorio"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Instala para jugar"
|
"message": "Instala para jugar"
|
||||||
},
|
},
|
||||||
@@ -266,39 +278,21 @@
|
|||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} other {# mods}}"
|
"message": "{count, plural, one {# mod} other {# mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
|
||||||
"message": "Modpack requerido"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Este servidor requiere ciertos mods. Pulsa Instalar para instalar los archivos requeridos de Modrinth y luego el launcher te enviara directo al servidor."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Instancia compartida"
|
"message": "Instancia compartida"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Instancia de servidor compartida"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Ver contenido"
|
"message": "Ver contenido"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Actualiza para jugar"
|
"message": "Actualiza para jugar"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "Actualización requerida"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Una actualización es requerida para jugar {name}. Por favor actualízala a la versión más reciente para ejecutar el juego."
|
|
||||||
},
|
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "El proyecto ya está instalado"
|
"message": "El proyecto ya está instalado"
|
||||||
},
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Volver a descubrir"
|
"message": "Volver a descubrir"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
|
||||||
"message": "Instalar contenido"
|
|
||||||
},
|
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Modo desarrollador activado."
|
"message": "Modo desarrollador activado."
|
||||||
},
|
},
|
||||||
@@ -910,26 +904,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader proporcionado por el servidor"
|
"message": "Loader proporcionado por el servidor"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Un archivo solo es revisado si es subido a Modrinth, independientemente de su formato de archivo (incluyendo .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "No mostrar esta advertencia otra vez"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Confirmar instalación"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Instalar de todos modos"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "El malware es normalmente distribuido por archivos de modpack que son normalmente compartidas en aplicaciones como Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "No pudimos encontrar este archivo en Modrinth. Recomendamos solo instalar archivos de sitios de confianza."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Advertencia de archivo desconocido"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,18 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Yritä uudelleen"
|
"message": "Yritä uudelleen"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Peruutettu"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Ei voitu ladata tiedostoja"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Ladattu tiedosto on vioittunut"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Ei voitu tallentaa tiedostoja"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Tuntematon instanssi"
|
"message": "Tuntematon instanssi"
|
||||||
},
|
},
|
||||||
@@ -167,9 +179,6 @@
|
|||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Löydä palvelimia"
|
"message": "Löydä palvelimia"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
|
||||||
"message": "Piilota lisätyt palvelimet"
|
|
||||||
},
|
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modipaketit"
|
"message": "Modipaketit"
|
||||||
},
|
},
|
||||||
@@ -191,9 +200,6 @@
|
|||||||
"app.export-modal.header": {
|
"app.export-modal.header": {
|
||||||
"message": "Vie modipaketti"
|
"message": "Vie modipaketti"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
|
||||||
"message": "Modipaketin nimi"
|
|
||||||
},
|
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Modipaketin nimi"
|
"message": "Modipaketin nimi"
|
||||||
},
|
},
|
||||||
@@ -218,9 +224,6 @@
|
|||||||
"app.install.phase.finalizing": {
|
"app.install.phase.finalizing": {
|
||||||
"message": "Viimeistellään"
|
"message": "Viimeistellään"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
|
||||||
"message": "Valmistellaan instanssia"
|
|
||||||
},
|
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Valmistellaan Javaa"
|
"message": "Valmistellaan Javaa"
|
||||||
},
|
},
|
||||||
@@ -359,50 +362,38 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Hae {count} maailmasta..."
|
"message": "Hae {count} maailmasta..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Sisältö vaaditaan"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Asenna pelataksesi"
|
"message": "Asenna pelataksesi"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Asenna silti"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Asenna"
|
"message": "Asenna"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} other {# modia}}"
|
"message": "{count, plural, one {# mod} other {# modia}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
|
||||||
"message": "Vaadittu modipaketti"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Tämä palvelin vaatii modeja toimiakseen. Klikkaa Asenna ladataksesi vaaditut tiedostot Modrinthista, ja käynnistä peli suoraan palvelimelle."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Jaettu instanssi"
|
"message": "Jaettu instanssi"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Jaettu palvelininstanssi"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Tarkastele sisältöä"
|
"message": "Tarkastele sisältöä"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Päivitä pelataksesi"
|
"message": "Päivitä pelataksesi"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "Päivitys vaaditaan"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Pävitys vaaditaan pelataksesi {name}. Päivitä viimeisimpään versioon pelataksesi."
|
|
||||||
},
|
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Tämä projekti on jo asennettu"
|
"message": "Tämä projekti on jo asennettu"
|
||||||
},
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Takaisin sisällön löytöön"
|
"message": "Takaisin sisällön löytöön"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.installing": {
|
||||||
"message": "Asenna sisältöä instanssiin"
|
"message": "Asennetaan"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "On jo asennettu"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Kehittäjätila käytössä."
|
"message": "Kehittäjätila käytössä."
|
||||||
@@ -575,6 +566,12 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Skinivalinta"
|
"message": "Skinivalinta"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Poista käytöstä"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Ota käyttöön"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App versio {version} on ladattu. Voit käynnistää sovelluksen uudelleen päivittääksesi heti tai antaa päivityksen asentua automaattisesti, kun suljet Modrinth Appin."
|
"message": "Modrinth App versio {version} on ladattu. Voit käynnistää sovelluksen uudelleen päivittääksesi heti tai antaa päivityksen asentua automaattisesti, kun suljet Modrinth Appin."
|
||||||
},
|
},
|
||||||
@@ -686,6 +683,9 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Kirjaudu Modrinth-tilille</link> lisätäksesi ystäviä ja nähdäksesi mitä he pelaavat!"
|
"message": "<link>Kirjaudu Modrinth-tilille</link> lisätäksesi ystäviä ja nähdäksesi mitä he pelaavat!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Luo pikakuvake"
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Lisää ja pelaa"
|
"message": "Lisää ja pelaa"
|
||||||
},
|
},
|
||||||
@@ -1018,26 +1018,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Modialusta on palvelimen tarjoama"
|
"message": "Modialusta on palvelimen tarjoama"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Tiedosto tarkistetaan vain jos se on ladattu Modrinthiin, riippumatta tiedoston muodosta (mukaanlukien .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Älä näytä tätä varoitusta uudestaan"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Vahvista asennus"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Asenna jokatapauksessa"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Haittaohjelmia levitetään usein modipaketti tiedostojen kautta jakamalla niitä alustoilla kuten Discordissa."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Emme löytäneet tätä tiedostoa Modrinthista. Suosittelemme vahvasti että asennat tiedostoja vain lähteistä joihin luotat."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Tuntematon tiedosto varoitus"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Itago ang mas marami pang tumatakbong instansiya"
|
"message": "Itago ang mas marami pang tumatakbong instansiya"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "Subukan muli"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Gumawa ng pangunahing instansiya"
|
"message": "Gumawa ng pangunahing instansiya"
|
||||||
},
|
},
|
||||||
@@ -143,9 +146,6 @@
|
|||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Tumuklas ng mga server"
|
"message": "Tumuklas ng mga server"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
|
||||||
"message": "Itago ang mga nailagay na mga servers"
|
|
||||||
},
|
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacks"
|
"message": "Modpacks"
|
||||||
},
|
},
|
||||||
@@ -164,9 +164,6 @@
|
|||||||
"app.export-modal.header": {
|
"app.export-modal.header": {
|
||||||
"message": "Iluwas ang modpack"
|
"message": "Iluwas ang modpack"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
|
||||||
"message": "Pangalan ng Modpack"
|
|
||||||
},
|
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Pangalan ng modpack"
|
"message": "Pangalan ng modpack"
|
||||||
},
|
},
|
||||||
@@ -245,9 +242,6 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Hanapin sa {count} mundo..."
|
"message": "Hanapin sa {count} mundo..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Nangangailangan ng kontento"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Mag-install upang malaro"
|
"message": "Mag-install upang malaro"
|
||||||
},
|
},
|
||||||
@@ -257,30 +251,15 @@
|
|||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} other {# na mod}}"
|
"message": "{count, plural, one {# mod} other {# na mod}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
|
||||||
"message": "Kinailangan na modpack"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Ang server rna ito ay nangangailangan ng mga mod upang makalaro. Pindutin ang install upang maihanda ang mga kinakailangang file galing sa Modrinth, matapos ay ilunsad nang diretso sa server."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Binahaging instansiya"
|
"message": "Binahaging instansiya"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Binahaging instansiyang pang-server"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Tingnan ang mga kontento"
|
"message": "Tingnan ang mga kontento"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Mag-update upang malaro"
|
"message": "Mag-update upang malaro"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "Kailangang mag-update"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Kailangang mag-update upang malaro ang {name}. Mangyaring mag-update sa pinakabagong bersiyon upang ma-launch ang laro."
|
|
||||||
},
|
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Naka-install na ang proyektong ito"
|
"message": "Naka-install na ang proyektong ito"
|
||||||
},
|
},
|
||||||
@@ -567,7 +546,7 @@
|
|||||||
"message": "Mga launch hook"
|
"message": "Mga launch hook"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.custom-hooks": {
|
"instance.settings.tabs.hooks.custom-hooks": {
|
||||||
"message": "Mga custom na launch hook"
|
"message": "Mga pasadyang launch hook"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.description": {
|
"instance.settings.tabs.hooks.description": {
|
||||||
"message": "Binibigyan-daan ng mga hook ang mga ekspertong tagagamit na makapagtakbo ng mga pansistemang utos o system command bago at pagkatapos ma-launch ang laro."
|
"message": "Binibigyan-daan ng mga hook ang mga ekspertong tagagamit na makapagtakbo ng mga pansistemang utos o system command bago at pagkatapos ma-launch ang laro."
|
||||||
@@ -630,7 +609,7 @@
|
|||||||
"message": "Window"
|
"message": "Window"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.custom-window-settings": {
|
"instance.settings.tabs.window.custom-window-settings": {
|
||||||
"message": "Mga setting sa custom na window"
|
"message": "Mga setting sa pasadyang window"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.fullscreen": {
|
"instance.settings.tabs.window.fullscreen": {
|
||||||
"message": "Fullscreen"
|
"message": "Fullscreen"
|
||||||
@@ -739,26 +718,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Ang loader ay handog na ng server"
|
"message": "Ang loader ay handog na ng server"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Ang file ay nasusuri lamang kapag ito ay na-upload sa Modrinth, walang pili sa file format nito (kabilang na ang .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Huwag ipakita ang babalang ito ulit"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Kumpirmahin ang installation"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "I-install pa rin"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Ang malware ay madalas naidadala sa mga modpack files sa pamamagitan ng pag-bigay ng mga ito sa mga platforms kagaya ng Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Hindi namin mahanap ang file na ito sa Modrinth. Mahalagang mag-install ka lamang ng files galing sa mga mapagkakatiwalang sources."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Hindi kilalang file"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"app.action-bar.downloading-java": {
|
"app.action-bar.downloading-java": {
|
||||||
"message": "Téléchargement de Java {version} en cours"
|
"message": "Téléchargement de Java {version}"
|
||||||
},
|
},
|
||||||
"app.action-bar.downloading-update": {
|
"app.action-bar.downloading-update": {
|
||||||
"message": "Téléchargement de la mise à jour"
|
"message": "Téléchargement de la mise à jour"
|
||||||
@@ -9,7 +9,13 @@
|
|||||||
"message": "Téléchargements"
|
"message": "Téléchargements"
|
||||||
},
|
},
|
||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Masquer plus d'instances en exécution"
|
"message": "Masquer plus d'instances en cours d'exécution"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Copié"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Copier les détails"
|
||||||
},
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Rejeter"
|
"message": "Rejeter"
|
||||||
@@ -20,29 +26,92 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Réessayer"
|
"message": "Réessayer"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Annulé en raison de la fermeture de l'application"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Impossible de lire le modpack"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Annulé"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "Le nettoyage n'a pas terminé"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Impossible de télécharger les fichiers"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Le fichier téléchargé est corrompu"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Impossible de sauvegarder les fichiers"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "Impossible de terminer le téléchargement"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "L'instance est introuvable"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "Le chemin d'accès au fichier est invalide"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Les données du modpack sont invalides"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Les fichiers du modpack contiennent des métadonnées invalides"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "L'installation de Java n'a pas pu se terminer"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "La mise en place du loader a échoué"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Impossible de mettre à jour les données locales"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "La mise en place de Minecraft a échoué"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Impossible d'atteindre les serveurs Modrinth"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Aucune permission d'écriture"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Impossible de télécharger le pack"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Quelque chose s'est mal passé"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Instance inconnue"
|
"message": "Instance inconnue"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.updating-shared-content": {
|
||||||
|
"message": "Mise à jour du contenu partagé"
|
||||||
|
},
|
||||||
"app.action-bar.installs": {
|
"app.action-bar.installs": {
|
||||||
"message": "Installations"
|
"message": "Installations"
|
||||||
},
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Définir en tante qu'instance première"
|
"message": "Définir en tant qu'instance principale"
|
||||||
},
|
},
|
||||||
"app.action-bar.no-instances-running": {
|
"app.action-bar.no-instances-running": {
|
||||||
"message": "Aucune instance en exécution"
|
"message": "Aucune instance en cours d'exécution"
|
||||||
},
|
},
|
||||||
"app.action-bar.offline": {
|
"app.action-bar.offline": {
|
||||||
"message": "Hors ligne"
|
"message": "Hors ligne"
|
||||||
},
|
},
|
||||||
"app.action-bar.primary-instance": {
|
"app.action-bar.primary-instance": {
|
||||||
"message": "Instance première"
|
"message": "Instance principale"
|
||||||
},
|
},
|
||||||
"app.action-bar.reload-to-update": {
|
"app.action-bar.reload-to-update": {
|
||||||
"message": "Recharger pour mettre à jour"
|
"message": "Recharger pour mettre à jour"
|
||||||
},
|
},
|
||||||
"app.action-bar.show-more-running-instances": {
|
"app.action-bar.show-more-running-instances": {
|
||||||
"message": "Montrer plus d'instances en exécution"
|
"message": "Montrer plus d'instances en cours d'exécution"
|
||||||
},
|
},
|
||||||
"app.action-bar.stop-instance": {
|
"app.action-bar.stop-instance": {
|
||||||
"message": "Arrêter l'instance"
|
"message": "Arrêter l'instance"
|
||||||
@@ -59,6 +128,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Voir les journaux"
|
"message": "Voir les journaux"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Tout accepter"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Les publicités rendent Modrinth possible et financent les rémunérations des créateurs. Nos partenaires peuvent stocker des cookies ou y accéder au sein de l'application afin de personnaliser les publicités et de mesurer les performances."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Gérer les préférences"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Tout refuser"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Votre vie privée et comment les publicités soutiennent Modrinth"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Permet un rendu avancé tel que des effets de flou qui peuvent causer des problèmes de performance sans rendu accéléré par le matériel."
|
"message": "Permet un rendu avancé tel que des effets de flou qui peuvent causer des problèmes de performance sans rendu accéléré par le matériel."
|
||||||
},
|
},
|
||||||
@@ -72,7 +156,7 @@
|
|||||||
"message": "Couleur du thème"
|
"message": "Couleur du thème"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.default-landing-page.description": {
|
"app.appearance-settings.default-landing-page.description": {
|
||||||
"message": "Modifier la page sur laquelle le lanceur s'ouvre."
|
"message": "Modifier la page sur laquelle le launcher s'ouvre."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.default-landing-page.home": {
|
"app.appearance-settings.default-landing-page.home": {
|
||||||
"message": "Accueil"
|
"message": "Accueil"
|
||||||
@@ -168,7 +252,7 @@
|
|||||||
"message": "Découvrir des serveurs"
|
"message": "Découvrir des serveurs"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "Masquer les serveurs déjà ajoutés"
|
"message": "Masquer les serveurs déjà installés"
|
||||||
},
|
},
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacks"
|
"message": "Modpacks"
|
||||||
@@ -210,7 +294,7 @@
|
|||||||
"message": "Téléchargement de Minecraft"
|
"message": "Téléchargement de Minecraft"
|
||||||
},
|
},
|
||||||
"app.install.phase.downloading_pack_file": {
|
"app.install.phase.downloading_pack_file": {
|
||||||
"message": "Téléchargement du fichier de pack"
|
"message": "Téléchargement le fichier de pack"
|
||||||
},
|
},
|
||||||
"app.install.phase.extracting_overrides": {
|
"app.install.phase.extracting_overrides": {
|
||||||
"message": "Extraction des fichiers personnalisés"
|
"message": "Extraction des fichiers personnalisés"
|
||||||
@@ -219,7 +303,7 @@
|
|||||||
"message": "Finalisation"
|
"message": "Finalisation"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Préparation de l'instance"
|
"message": "En attente d'installation"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Préparation de Java"
|
"message": "Préparation de Java"
|
||||||
@@ -257,6 +341,36 @@
|
|||||||
"app.install.phase.running_loader_processors": {
|
"app.install.phase.running_loader_processors": {
|
||||||
"message": "Exécution des processeurs du chargeur"
|
"message": "Exécution des processeurs du chargeur"
|
||||||
},
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.added-label": {
|
||||||
|
"message": "Ajouté"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-body": {
|
||||||
|
"message": "Votre instance locale est en avance sur celles des utilisateurs avec lesquels vous l’avez partagée."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-header": {
|
||||||
|
"message": "Vos modifications n’ont pas encore été partagées"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publish-button": {
|
||||||
|
"message": "Publier la mise à jour"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publishing-button": {
|
||||||
|
"message": "Publication..."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.removed-label": {
|
||||||
|
"message": "Supprimé"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-admonition-header": {
|
||||||
|
"message": "Publier la mise à jour"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-description": {
|
||||||
|
"message": "Examiner les modifications de contenu qui seront partagées avec tous les utilisateurs de cette instance."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-header": {
|
||||||
|
"message": "Examiner les modifications"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.reviewing-button": {
|
||||||
|
"message": "Examination..."
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Toutes les données pour votre instance seront supprimées à jamais, y compris vos mondes, vos configurations, et le contenu installé."
|
"message": "Toutes les données pour votre instance seront supprimées à jamais, y compris vos mondes, vos configurations, et le contenu installé."
|
||||||
},
|
},
|
||||||
@@ -293,6 +407,9 @@
|
|||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "projet"
|
"message": "projet"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.locked-content": {
|
||||||
|
"message": "Le contenu dans les instances verrouillées ne peut pas être modifié."
|
||||||
|
},
|
||||||
"app.instance.mods.project-was-added": {
|
"app.instance.mods.project-was-added": {
|
||||||
"message": "« {name} » a été ajouté"
|
"message": "« {name} » a été ajouté"
|
||||||
},
|
},
|
||||||
@@ -308,6 +425,102 @@
|
|||||||
"app.instance.mods.successfully-uploaded": {
|
"app.instance.mods.successfully-uploaded": {
|
||||||
"message": "Mis en ligne avec succès"
|
"message": "Mis en ligne avec succès"
|
||||||
},
|
},
|
||||||
|
"app.instance.share.empty.description": {
|
||||||
|
"message": "Vous pouvez partager cette instance avec vos amis !"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.heading": {
|
||||||
|
"message": "Aucun ami invité"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.invite-friends-button": {
|
||||||
|
"message": "Inviter des amis"
|
||||||
|
},
|
||||||
|
"app.instance.share.invite-modal.heading": {
|
||||||
|
"message": "Partager {name}"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-prefix": {
|
||||||
|
"message": "Vous devez vous connecter en tant que"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-suffix": {
|
||||||
|
"message": "pour accéder à cette page."
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.linked-account-fallback": {
|
||||||
|
"message": "le compte lié"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.signed-out-heading": {
|
||||||
|
"message": "Non connecté"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.switch-account-button": {
|
||||||
|
"message": "Changer de compte"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.wrong-account-heading": {
|
||||||
|
"message": "Mauvais compte"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-access": {
|
||||||
|
"message": "Ils vont désormais cesser de recevoir des mises à jour pour cette instance partagée"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-installed-copy": {
|
||||||
|
"message": "N'importe copie qu'ils ont installée va rester sur leur appareil"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-invite-again": {
|
||||||
|
"message": "Vous pouvez les inviter plus tard"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-last-user": {
|
||||||
|
"message": "C'est le dernier utilisateur, le partage va être désactivé pour cette instance"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effects-label": {
|
||||||
|
"message": "Que se passe-t-il ?"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.header": {
|
||||||
|
"message": "Révoquer l'accès"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.remove-button": {
|
||||||
|
"message": "Révoquer l'accès"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.user-avatar-alt": {
|
||||||
|
"message": "avatar de {username}"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.warning-body": {
|
||||||
|
"message": "Si vous révoquez l'accès de {username} à cette instance partagée, vous aurez besoin de les inviter de nouveau avant qu'ils puissent recevoir des mises à jour."
|
||||||
|
},
|
||||||
|
"app.instance.share.sign-in.button": {
|
||||||
|
"message": "Se connecter"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.body": {
|
||||||
|
"message": "Vous devez délier ce modpack pour partager votre instance"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.header": {
|
||||||
|
"message": "Partager nécessite de délier"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.body": {
|
||||||
|
"message": "Cette instance partagée est déjà installée en tant que <bold>{instanceName}</bold>. Êtes-vous sûr de vouloir installer une autre copie ?"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.header": {
|
||||||
|
"message": "L'instance partagée est déjà installée"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.install-anyway": {
|
||||||
|
"message": "Installer quand même"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.instance": {
|
||||||
|
"message": "Instance"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.fallback-username": {
|
||||||
|
"message": "le compte lié"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.owner-admonition-body-v2": {
|
||||||
|
"message": "pour gérer cette instance partagée. Vous ne pourrez pas déployer des mises à jour aux utilisateurs."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.sign-in-as-label": {
|
||||||
|
"message": "Se connecter en tant que"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.signed-out-header": {
|
||||||
|
"message": "Vous devez vous connecter à Modrinth"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.user-admonition-body-v2": {
|
||||||
|
"message": "pour recevoir des mises à jour pour cette instance partagée."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.warning-header": {
|
||||||
|
"message": "Vous utilisez le mauvais compte Modrinth"
|
||||||
|
},
|
||||||
"app.instance.worlds.add-server": {
|
"app.instance.worlds.add-server": {
|
||||||
"message": "Ajouter le serveur"
|
"message": "Ajouter le serveur"
|
||||||
},
|
},
|
||||||
@@ -359,29 +572,80 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Rechercher {count} mondes..."
|
"message": "Rechercher {count} mondes..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
"app.modal.install-to-play.additional-context": {
|
||||||
"message": "Contenu requis"
|
"message": "Contexte additionnel"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.additional-context-placeholder": {
|
||||||
|
"message": "Si possible, incluez des liens et des images pertinentes"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.content-you-are-reporting": {
|
||||||
|
"message": "L'instance que vous signalez"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.delete-instance": {
|
||||||
|
"message": "Supprimer l'instance"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.external-files-dont-install": {
|
||||||
|
"message": "Ne pas installer"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Installer pour jouer"
|
"message": "Installer pour jouer"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Installer quand même"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Installer"
|
"message": "Installer"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Cette invitation a été crée par un autre utilisateur Modrinth, pas par Modrinth. N'acceptez seulement les invitations de personnes en qui vous avez confiance."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} other {# mods}}"
|
"message": "{count, plural, one {# mod} other {# mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.report-description": {
|
||||||
"message": "Modpack requis"
|
"message": "Utilisez ce formulaire pour signaler les instances qui peuvent enfreindre nos <rules-link>Règles</rules-link> ou <terms-link>les Conditions d'Utilisation</terms-link>."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
"app.modal.install-to-play.report-image-invalid-type": {
|
||||||
"message": "Ce serveur a besoin de mods pour jouer. Cliquez sur Installer pour mettre en place les fichiers requis depuis Modrinth, puis lancez directement dans le serveur."
|
"message": "Le fichier n'est pas un type d'image accepté"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-image-too-large": {
|
||||||
|
"message": "Le fichier dépasse la limite de 1 MiB"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason": {
|
||||||
|
"message": "Quelle règle cette instance enfreint-elle ?"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.inappropriate": {
|
||||||
|
"message": "Inapproprié"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.malicious": {
|
||||||
|
"message": "Malicieux"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.spam": {
|
||||||
|
"message": "Spam"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-shared-instance-header": {
|
||||||
|
"message": "Signaler une instance partagée"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-submitted": {
|
||||||
|
"message": "Signalement soumis"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
|
"message": "Un fichier est seulement examiné s'il est publié sur Modrinth, peu importe son extension (y compris .mrpack)."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Instance partagée"
|
"message": "Instance partagée"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.shared-instance-content": {
|
||||||
"message": "Instance serveur partagée"
|
"message": "Contenu de l'instance partagée"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
|
"message": "Ce modpack de serveur contient des fichiers qui ne sont pas publiés sur Modrinth. Nous recommandons fortement de seulement installer des fichiers de sources en qui vous avez confiance."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Avertissement de fichiers inconnus"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Fichiers non reconnus"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Voir le contenu"
|
"message": "Voir le contenu"
|
||||||
@@ -389,20 +653,47 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Mettre à jour pour jouer"
|
"message": "Mettre à jour pour jouer"
|
||||||
},
|
},
|
||||||
|
"app.modal.update-to-play.removed": {
|
||||||
|
"message": "Supprimé"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.server-modpack-unknown-files-description": {
|
||||||
|
"message": "Cette mise à jour du modpack de ce serveur contient des fichiers qui ne sont pas publiés sur Modrinth. Nous recommandons fortement de seulement installer des fichiers de sources en qui vous avez confiance."
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-added-label": {
|
||||||
|
"message": "Ajouté"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-removed-label": {
|
||||||
|
"message": "Supprimé"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "Cette mise à jour d'instance partagée contient des fichiers qui ne sont pas publiés sur Modrinth. Nous recommandons fortement de seulement installer des fichiers de sources en qui vous avez confiance."
|
||||||
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.update-required": {
|
||||||
"message": "Mise à jour requise"
|
"message": "Mise à jour requise"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required-description": {
|
"app.modal.update-to-play.update-required-description": {
|
||||||
"message": "Une mise à jour est requise pour jouer à {name}. Veuillez mettre à jour à la dernière version pour lancer le jeu."
|
"message": "Une mise à jour est requise pour jouer à {name}. Veuillez mettre à jour vers la dernière version pour lancer le jeu."
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Ce projet a déjà été installé"
|
"message": "Ce projet a déjà été installé"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Changer de version"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Retour vers la page découvrir"
|
"message": "Retour vers la page découvrir"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Installer du contenu à l'instance"
|
"message": "Toutes les versions"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Télécharger dans le navigateur"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Installation"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Déjà installé"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Mode développeur activé."
|
"message": "Mode développeur activé."
|
||||||
@@ -410,6 +701,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "Téléchargement de la version {version}"
|
"message": "Téléchargement de la version {version}"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Les publicités rendent Modrinth possible et financent les rémunérations des créateurs. Nos partenaires peuvent stocker des cookies ou y accéder au sein de l'application afin de personnaliser les publicités et de mesurer les performances. Vous pouvez refuser ou gérer vos préférences ci-dessous."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Apparence"
|
"message": "Apparence"
|
||||||
},
|
},
|
||||||
@@ -452,6 +746,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Erreur lors du traitement du fichier"
|
"message": "Erreur lors du traitement du fichier"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Ce skin utilise des fonctionnalités du mod {ears}"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Modifier le skin"
|
"message": "Modifier le skin"
|
||||||
},
|
},
|
||||||
@@ -501,7 +798,7 @@
|
|||||||
"message": "Texture"
|
"message": "Texture"
|
||||||
},
|
},
|
||||||
"app.skins.modal.upload-skin-first-tooltip": {
|
"app.skins.modal.upload-skin-first-tooltip": {
|
||||||
"message": "Importez d'abord une skin !"
|
"message": "Importez d'abord un skin !"
|
||||||
},
|
},
|
||||||
"app.skins.preview.edit-button": {
|
"app.skins.preview.edit-button": {
|
||||||
"message": "Modifier le skin"
|
"message": "Modifier le skin"
|
||||||
@@ -524,6 +821,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Cubes du chaos"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chassez les cieux"
|
"message": "Chassez les cieux"
|
||||||
},
|
},
|
||||||
@@ -552,7 +852,7 @@
|
|||||||
"message": "Striding Hero"
|
"message": "Striding Hero"
|
||||||
},
|
},
|
||||||
"app.skins.section.the-copper-age": {
|
"app.skins.section.the-copper-age": {
|
||||||
"message": "The Copper Age"
|
"message": "L'âge du cuivre"
|
||||||
},
|
},
|
||||||
"app.skins.section.the-garden-awakens": {
|
"app.skins.section.the-garden-awakens": {
|
||||||
"message": "L'éveil du jardin"
|
"message": "L'éveil du jardin"
|
||||||
@@ -575,6 +875,12 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Sélecteur de skin"
|
"message": "Sélecteur de skin"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Désactiver"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Activer"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App v{version} a finie d'être téléchargée. Rechargez pour mettre à jour maintenant, ou automatiquement quand vous fermez Modrinth App."
|
"message": "Modrinth App v{version} a finie d'être téléchargée. Rechargez pour mettre à jour maintenant, ou automatiquement quand vous fermez Modrinth App."
|
||||||
},
|
},
|
||||||
@@ -620,6 +926,21 @@
|
|||||||
"app.world.world-item.offline": {
|
"app.world.world-item.offline": {
|
||||||
"message": "Hors ligne"
|
"message": "Hors ligne"
|
||||||
},
|
},
|
||||||
|
"content.shared-instance.change-version-body": {
|
||||||
|
"message": "Changer la version change seulement votre copie locale. Des futures mises à jour d'instance partagées peuvent restaurer ou changer la version."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-button": {
|
||||||
|
"message": "Supprimer quand même"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-many-button": {
|
||||||
|
"message": "Supprimer {count, number} projets quand même"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-button": {
|
||||||
|
"message": "Désactiver quand même"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-many-button": {
|
||||||
|
"message": "Désactiver {count, number} projets quand même"
|
||||||
|
},
|
||||||
"friends.action.add-friend": {
|
"friends.action.add-friend": {
|
||||||
"message": "Ajouter un ami"
|
"message": "Ajouter un ami"
|
||||||
},
|
},
|
||||||
@@ -683,6 +1004,33 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Créer un compte Modrinth</link> pour ajouter des amis et voir à quoi ils jouent !"
|
"message": "<link>Créer un compte Modrinth</link> pour ajouter des amis et voir à quoi ils jouent !"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Créer un raccourci"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Exporter le modpack"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Lancer l'instance"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "Plus d'actions"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Ouvrir le dossier"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Réparer"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Paramètres d'instance"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Démarrage..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Arrêt..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Ajouter et jouer"
|
"message": "Ajouter et jouer"
|
||||||
},
|
},
|
||||||
@@ -725,6 +1073,15 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Sauvegarder en tant que..."
|
"message": "Sauvegarder en tant que..."
|
||||||
},
|
},
|
||||||
|
"instance.locked.delete-button": {
|
||||||
|
"message": "Supprimer l'instance"
|
||||||
|
},
|
||||||
|
"instance.locked.play-tooltip": {
|
||||||
|
"message": "Cette instance a été verrouillée"
|
||||||
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Jamais joué"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Adresse"
|
"message": "Adresse"
|
||||||
},
|
},
|
||||||
@@ -899,6 +1256,9 @@
|
|||||||
"instance.settings.tabs.java.java-path-placeholder": {
|
"instance.settings.tabs.java.java-path-placeholder": {
|
||||||
"message": "/chemin/vers/java"
|
"message": "/chemin/vers/java"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.sharing": {
|
||||||
|
"message": "Partage"
|
||||||
|
},
|
||||||
"instance.settings.tabs.window": {
|
"instance.settings.tabs.window": {
|
||||||
"message": "Fenêtre"
|
"message": "Fenêtre"
|
||||||
},
|
},
|
||||||
@@ -929,6 +1289,51 @@
|
|||||||
"instance.settings.tabs.window.width.enter": {
|
"instance.settings.tabs.window.width.enter": {
|
||||||
"message": "Entrer la largeur..."
|
"message": "Entrer la largeur..."
|
||||||
},
|
},
|
||||||
|
"instance.shared-instance.error.title": {
|
||||||
|
"message": "Quelque chose s'est mal passé"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.owner-tooltip": {
|
||||||
|
"message": "Le contenu de cette instance est partagé à d'autres utilisateurs."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.added-label": {
|
||||||
|
"message": "Ajouté"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.admonition-header": {
|
||||||
|
"message": "Déployer la mise à jour aux joueurs"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.config-title-v2": {
|
||||||
|
"message": "Sélectionner les fichiers de configuration"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.description": {
|
||||||
|
"message": "Examiner les changements de contenu et choisir n'importe quel fichier de configuration à inclure dans cette mise à jour."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.header": {
|
||||||
|
"message": "Examiner les changements"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.publish-button": {
|
||||||
|
"message": "Déployer la mise à jour"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.removed-label": {
|
||||||
|
"message": "Supprimé"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.tooltip": {
|
||||||
|
"message": "Le contenu de cette instance est gérée par quelqu'un d'autre."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.deleted-text": {
|
||||||
|
"message": "L'instance principale a été supprimée. Cette instance est encore disponible, mais n'est plus liée et va cesser de recevoir des mises à jour."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-title": {
|
||||||
|
"message": "Instance verrouillée"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.manager-fallback": {
|
||||||
|
"message": "le gestionnaire d'instance"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.text": {
|
||||||
|
"message": "L'instance principale a été supprimée. Cette instance est encore disponible, mais n'est plus liée et ne va plus recevoir de mises à jour."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.title": {
|
||||||
|
"message": "Instance partagée n'est plus disponible"
|
||||||
|
},
|
||||||
"instance.worlds.a_minecraft_server": {
|
"instance.worlds.a_minecraft_server": {
|
||||||
"message": "Un Serveur Minecraft"
|
"message": "Un Serveur Minecraft"
|
||||||
},
|
},
|
||||||
@@ -992,6 +1397,63 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Se connecter à Minecraft"
|
"message": "Se connecter à Minecraft"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Vous avez besoin d'un compte Microsoft qui possède Minecraft avant de jouer."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Se connecter à un compte Microsoft"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Pas de compte ?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Obtenir Minecraft"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Obtenir de l'aide"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft requis"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Se connecter à Microsoft"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.browser-description": {
|
||||||
|
"message": "A nouvel onglet a été ouvert pour vous connecter. Finissez la connexion, puis retournez dans l'application."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.cancel-button": {
|
||||||
|
"message": "Annuler"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.continue-in-browser-heading": {
|
||||||
|
"message": "Continuer dans votre navigateur"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.create-account-button": {
|
||||||
|
"message": "Créer un compte"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.description": {
|
||||||
|
"message": "Vous aurez besoin de vous connecter à votre compte Modrinth avant de pouvoir utiliser cette fonctionnalité."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.header": {
|
||||||
|
"message": "Compte requis"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.open-browser-again-button": {
|
||||||
|
"message": "Ouvrir de nouveau le navigateur"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-button": {
|
||||||
|
"message": "Se connecter à Modrinth"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-heading": {
|
||||||
|
"message": "Se connecter à un compte Modrinth"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.signing-in-header": {
|
||||||
|
"message": "Connexion"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.support-prompt": {
|
||||||
|
"message": "Vous avez des problèmes à vous connecter ? <support>Obtenez de l'aide</support>"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.waiting-for-browser": {
|
||||||
|
"message": "En attente de la confirmation du navigateur..."
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Procuré par l'instance"
|
"message": "Procuré par l'instance"
|
||||||
},
|
},
|
||||||
@@ -1015,26 +1477,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Le loader est procuré par le serveur"
|
"message": "Le loader est procuré par le serveur"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Un fichier n’est révisé que s’il est téléchargé sur Modrinth, quel que soit son format de fichier (y compris .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Ne plus m'avertir à ce sujet"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Confirmer l'installation"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Installer tout de même"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Les logiciels malveillants sont souvent distribués via des fichiers modpack en les partageant sur des plateformes comme Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Nous ne pouvions pas trouver ce fichier sur Modrinth. Nous vous recommandons fortement de n'installer que des fichiers de sources de confiance."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Avertissement fichier inconnu"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,9 +59,6 @@
|
|||||||
"app.export-modal.header": {
|
"app.export-modal.header": {
|
||||||
"message": "יצוא חבילת מודים"
|
"message": "יצוא חבילת מודים"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
|
||||||
"message": "שם חבילת המודים"
|
|
||||||
},
|
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "שם חבילת המודים"
|
"message": "שם חבילת המודים"
|
||||||
},
|
},
|
||||||
@@ -140,9 +137,6 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "חיפוש ב-{count} עולמות..."
|
"message": "חיפוש ב-{count} עולמות..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "תוכן נדרש"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "צריך להתקין כדי לשחק"
|
"message": "צריך להתקין כדי לשחק"
|
||||||
},
|
},
|
||||||
@@ -152,30 +146,15 @@
|
|||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {מוד אחד} other {# מודים}}"
|
"message": "{count, plural, one {מוד אחד} other {# מודים}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
|
||||||
"message": "חבילת מודים נדרשת"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "שרת זה דורש מודים כדי לשחק. לחץ על \"התקן\" כדי להגדיר את הקבצים הנדרשים מ-Modrinth, ולאחר מכן הפעל ישירות לשרת."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "התקנה משותפת"
|
"message": "התקנה משותפת"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "התקנת שרת משותפת"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "הצג תוכן"
|
"message": "הצג תוכן"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "צריך לעדכן כדי לשחק"
|
"message": "צריך לעדכן כדי לשחק"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "עדכון נדרש"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "עדכון נדרש כדי לשחק ב{name}. ניתן להתחיל את המשחק רק לאחר עדכון לגרסה החדשה."
|
|
||||||
},
|
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "מצב מפתח מופעל."
|
"message": "מצב מפתח מופעל."
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -9,25 +9,103 @@
|
|||||||
"message": "Letöltések"
|
"message": "Letöltések"
|
||||||
},
|
},
|
||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "További futó példányok elrejtése"
|
"message": "További futó játékpéldányok elrejtése"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Másolva"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Részletek másolása"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "Elutasítás"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "Játékpéldány megnyitása"
|
||||||
},
|
},
|
||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Újra"
|
"message": "Újra"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Az alkalmazás bezárása miatt megszakítva"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Nem sikerült beolvasni a modcsomagot"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Megszakítva"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "A tisztítás nem fejeződött be"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Nem sikerült letölteni a fájlokat"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "A letöltött fájl sérült"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Nem sikerült elmenteni a fájlokat"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "A letöltés nem fejeződött be"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "A játékpéldány nem található"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "A fájl elérési útja érvénytelen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "A modcsomag adatai érvénytelenek"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "A modcsomag fájljainak metaadatai érvénytelenek"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "A Java telepítése nem tudott befejeződni"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "A betöltő beállítása sikertelen volt"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "A helyi adatok frissítése nem sikerült"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "A Minecraft telepítése meghiúsult"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Nem sikerült elérni Modrinthot"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Nincs írási jogosultság"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Nem sikerült letölteni a csomagot"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Valami hiba történt"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Ismeretlen profil"
|
"message": "Ismeretlen játékpéldány"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.updating-shared-content": {
|
||||||
|
"message": "Megosztott tartalom frissítése"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "Telepítések"
|
||||||
},
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Beállítás elsődleges példányként"
|
"message": "Beállítás elsődleges játékpéldányként"
|
||||||
},
|
},
|
||||||
"app.action-bar.no-instances-running": {
|
"app.action-bar.no-instances-running": {
|
||||||
"message": "Nincsenek futó példányok"
|
"message": "Nincsenek futó játékpéldányok"
|
||||||
},
|
},
|
||||||
"app.action-bar.offline": {
|
"app.action-bar.offline": {
|
||||||
"message": "Offline"
|
"message": "Offline"
|
||||||
},
|
},
|
||||||
"app.action-bar.primary-instance": {
|
"app.action-bar.primary-instance": {
|
||||||
"message": "Elsődleges példány"
|
"message": "Elsődleges játékpéldány"
|
||||||
},
|
},
|
||||||
"app.action-bar.reload-to-update": {
|
"app.action-bar.reload-to-update": {
|
||||||
"message": "Töltsd újra a frissítéshez"
|
"message": "Töltsd újra a frissítéshez"
|
||||||
@@ -36,7 +114,7 @@
|
|||||||
"message": "További futó pédányok megjelenítése"
|
"message": "További futó pédányok megjelenítése"
|
||||||
},
|
},
|
||||||
"app.action-bar.stop-instance": {
|
"app.action-bar.stop-instance": {
|
||||||
"message": "Példány leállítása"
|
"message": "Játékpéldány leállítása"
|
||||||
},
|
},
|
||||||
"app.action-bar.update": {
|
"app.action-bar.update": {
|
||||||
"message": "Frissítés"
|
"message": "Frissítés"
|
||||||
@@ -45,16 +123,31 @@
|
|||||||
"message": "Aktív letöltések megtekintése"
|
"message": "Aktív letöltések megtekintése"
|
||||||
},
|
},
|
||||||
"app.action-bar.view-instance": {
|
"app.action-bar.view-instance": {
|
||||||
"message": "Példányok megtekintése"
|
"message": "Játékpéldány megtekintése"
|
||||||
},
|
},
|
||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Naplók megtekintése"
|
"message": "Naplók megtekintése"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Összes elfogadása"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "A hirdetések teszik lehetővé a Modrinth működését, és biztosítják a tartalomkészítők juttatásait. Partnereink sütiket tárolhatnak vagy érhetnek el az alkalmazásban a hirdetések személyre szabása és a teljesítmény mérése céljából."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Beállítások kezelése"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Összes elutasítása"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Adataid védelme és a hirdetések szerepe a Modrinth működésében"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Lehetővé teszi olyan speciális megjelenítési effektusok használatát, mint például az elmosódás, amelyek hardveres gyorsítás nélkül teljesítménycsökkenést okozhatnak."
|
"message": "Lehetővé teszi olyan speciális megjelenítési effektusok használatát, mint például az elmosódás, amelyek hardveres gyorsítás nélkül teljesítménycsökkenést okozhatnak."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.advanced-rendering.title": {
|
"app.appearance-settings.advanced-rendering.title": {
|
||||||
"message": "Fejlett renderelés"
|
"message": "Haladó megjelenítési beállítások"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.color-theme.description": {
|
"app.appearance-settings.color-theme.description": {
|
||||||
"message": "Válaszd ki a Modrinth Apphoz a kívánt színsémát."
|
"message": "Válaszd ki a Modrinth Apphoz a kívánt színsémát."
|
||||||
@@ -84,7 +177,7 @@
|
|||||||
"message": "A kezdőlap „Folytasd itt” részében a legújabb világok is megtalálhatók."
|
"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": {
|
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||||
"message": "Visszaugrás a világokba"
|
"message": "„Folytasd itt” a világokat is"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.minimize-launcher.description": {
|
"app.appearance-settings.minimize-launcher.description": {
|
||||||
"message": "Minimalizáld az indítót a Minecraft indításakor."
|
"message": "Minimalizáld az indítót a Minecraft indításakor."
|
||||||
@@ -102,11 +195,17 @@
|
|||||||
"message": "Válassz egy lehetőséget"
|
"message": "Válassz egy lehetőséget"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.show-play-time.description": {
|
"app.appearance-settings.show-play-time.description": {
|
||||||
"message": "Megmutatja, mennyi időt töltöttél játszva egy profillal."
|
"message": "Megmutatja, mennyi időt töltöttél egy játékpéldányban."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.show-play-time.title": {
|
"app.appearance-settings.show-play-time.title": {
|
||||||
"message": "Játékidő megjelenítése"
|
"message": "Játékidő megjelenítése"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "Az alacsony kockázatú megerősítéseket – például a modcsomagok ismételt telepítését, a szokásos tartalomtörlést, a tömeges frissítéseket, a modcsomagok kapcsolatának megszüntetését és a javítási felhívásokat – a rendszer automatikusan kihagyja. A veszélyes figyelmeztetéseket továbbra is megjeleníti."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "Hagyd ki a lényegtelen figyelmeztetéseket"
|
||||||
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "Lehetővé teszi az oldalsáv be- és kikapcsolását."
|
"message": "Lehetővé teszi az oldalsáv be- és kikapcsolását."
|
||||||
},
|
},
|
||||||
@@ -126,13 +225,13 @@
|
|||||||
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
|
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
|
||||||
},
|
},
|
||||||
"app.browse.add-servers-to-instance": {
|
"app.browse.add-servers-to-instance": {
|
||||||
"message": "Szerver hozzáadása a példányhoz"
|
"message": "Szerver hozzáadása a játékpéldányhoz"
|
||||||
},
|
},
|
||||||
"app.browse.add-to-an-instance": {
|
"app.browse.add-to-an-instance": {
|
||||||
"message": "Hozzáadás egy példányhoz"
|
"message": "Hozzáadás egy játékpéldányhoz"
|
||||||
},
|
},
|
||||||
"app.browse.add-to-instance": {
|
"app.browse.add-to-instance": {
|
||||||
"message": "Példányhoz adás"
|
"message": "Hozzáadás a játékpéldányhoz"
|
||||||
},
|
},
|
||||||
"app.browse.add-to-instance-name": {
|
"app.browse.add-to-instance-name": {
|
||||||
"message": "Hozzáadás ehhez: {instanceName}"
|
"message": "Hozzáadás ehhez: {instanceName}"
|
||||||
@@ -144,7 +243,7 @@
|
|||||||
"message": "Már hozzá van adva"
|
"message": "Már hozzá van adva"
|
||||||
},
|
},
|
||||||
"app.browse.back-to-instance": {
|
"app.browse.back-to-instance": {
|
||||||
"message": "Vissza a példányhoz"
|
"message": "Vissza a játékpéldányhoz"
|
||||||
},
|
},
|
||||||
"app.browse.discover-content": {
|
"app.browse.discover-content": {
|
||||||
"message": "Tartalom böngészése"
|
"message": "Tartalom böngészése"
|
||||||
@@ -153,16 +252,16 @@
|
|||||||
"message": "Szerverek böngészése"
|
"message": "Szerverek böngészése"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "Már hozzáadott szerverek elrejtése"
|
"message": "A már hozzáadott szerverek elrejtése"
|
||||||
},
|
},
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modcsomagok"
|
"message": "Modcsomagok"
|
||||||
},
|
},
|
||||||
"app.browse.server-instance-content-warning": {
|
"app.browse.server-instance-content-warning": {
|
||||||
"message": "A tartalom hozzáadása ronthatja a kompatibilitást a szerverhez való csatlakozáskor. A hozzáadott tartalom elveszik, ha frissíted a szerverprofil tartalmát."
|
"message": "A tartalom hozzáadása ronthatja a kompatibilitást a szerverhez való csatlakozáskor. A hozzáadott tartalom elveszik, ha frissíted a szerverpéldány tartalmát."
|
||||||
},
|
},
|
||||||
"app.browse.server.installing": {
|
"app.browse.server.installing": {
|
||||||
"message": "Letöltés..."
|
"message": "Letöltés"
|
||||||
},
|
},
|
||||||
"app.content-install.no-compatible-versions": {
|
"app.content-install.no-compatible-versions": {
|
||||||
"message": "Nincs a(z) {compatibilityLabel} verziónak megfelelő elérhető verzió. Válassz ki egy verziót, ha mégis telepíteni szeretnéd. A függőségek nem települnek automatikusan."
|
"message": "Nincs a(z) {compatibilityLabel} verziónak megfelelő elérhető verzió. Válassz ki egy verziót, ha mégis telepíteni szeretnéd. A függőségek nem települnek automatikusan."
|
||||||
@@ -177,7 +276,7 @@
|
|||||||
"message": "Modcsomag exportálása"
|
"message": "Modcsomag exportálása"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
"app.export-modal.modpack-name-label": {
|
||||||
"message": "A modcsomag neve"
|
"message": "Modcsamag neve"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "A modcsomag neve"
|
"message": "A modcsomag neve"
|
||||||
@@ -188,23 +287,101 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
"app.install.phase.resolving_loader": {
|
"app.install.phase.downloading_content": {
|
||||||
"message": ""
|
"message": "A tartalom letöltése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_minecraft": {
|
||||||
|
"message": "A Minecraft letöltése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_pack_file": {
|
||||||
|
"message": "A csomagfájl letöltése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.extracting_overrides": {
|
||||||
|
"message": "Felülírások kibontása..."
|
||||||
|
},
|
||||||
|
"app.install.phase.finalizing": {
|
||||||
|
"message": "Befejezés..."
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_instance": {
|
||||||
|
"message": "Telepítésre vár..."
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java": {
|
||||||
|
"message": "A Java előkészítése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "A Java {version} letöltése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "A Java {version} kibontása..."
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "A Java {version} előkészítése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.resolving": {
|
||||||
|
"message": "A Java {version} előkészítése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "A Java {version} ellenőrzése..."
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "Csomag adati kiolvasása"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_minecraft": {
|
||||||
|
"message": "Minecraft Betöltése"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_pack": {
|
||||||
|
"message": "Tartalom betöltése"
|
||||||
|
},
|
||||||
|
"app.install.phase.rolling_back": {
|
||||||
|
"message": "Visszavonás"
|
||||||
|
},
|
||||||
|
"app.install.phase.running_loader_processors": {
|
||||||
|
"message": "Betöltő folyamatok futtatása"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.added-label": {
|
||||||
|
"message": "Hozzáadva"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-body": {
|
||||||
|
"message": "A helyi példányod előrébb tart, mint azoké a felhasználóké, akikkel megosztottad."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-header": {
|
||||||
|
"message": "A változtatásaid még nem lettek megosztva"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publish-button": {
|
||||||
|
"message": "Frissítés közzététele"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publishing-button": {
|
||||||
|
"message": "Közzététel..."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.removed-label": {
|
||||||
|
"message": "Eltávolítva"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-admonition-header": {
|
||||||
|
"message": "Frissítés közzététele"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-description": {
|
||||||
|
"message": "A példányt használó összes résztvevővel megosztásra kerülő tartalomváltoztatások áttekintése."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-header": {
|
||||||
|
"message": "Változtatások áttekintése"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.reviewing-button": {
|
||||||
|
"message": "Áttekintés..."
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Az profilodhoz tartozó összes adat véglegesen törlődik, beleértve a világokat, a beállításokat és az összes telepített tartalmat."
|
"message": "A játékpéldányhoz tartozó összes adat véglegesen törlődik, beleértve a világokat, a beállításokat és az összes telepített tartalmat."
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.admonition-header": {
|
"app.instance.confirm-delete.admonition-header": {
|
||||||
"message": "Ezt a műveletet nem lehet visszavonni"
|
"message": "Ezt a műveletet nem lehet visszavonni"
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.delete-button": {
|
"app.instance.confirm-delete.delete-button": {
|
||||||
"message": "Profil törlése"
|
"message": "Játékpéldány törlése"
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.header": {
|
"app.instance.confirm-delete.header": {
|
||||||
"message": "Profil törlése"
|
"message": "Játékpéldány törlése"
|
||||||
},
|
},
|
||||||
"app.instance.modpack-already-installed.body": {
|
"app.instance.modpack-already-installed.body": {
|
||||||
"message": "Ez a modcsomag már telepítve van a(z) <bold>{instanceName}</bold> profilban. Biztosan duplikálni szeretnéd?"
|
"message": "Ez a modcsomag már telepítve van a(z) <bold>{instanceName}</bold> játékpéldányban. Biztosan duplikálni szeretnéd?"
|
||||||
},
|
},
|
||||||
"app.instance.modpack-already-installed.create": {
|
"app.instance.modpack-already-installed.create": {
|
||||||
"message": "Létrehozás"
|
"message": "Létrehozás"
|
||||||
@@ -213,13 +390,25 @@
|
|||||||
"message": "A modcsomag már telepítve van"
|
"message": "A modcsomag már telepítve van"
|
||||||
},
|
},
|
||||||
"app.instance.modpack-already-installed.instance": {
|
"app.instance.modpack-already-installed.instance": {
|
||||||
"message": "Példány"
|
"message": "Játékpéldány"
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "{current, number}/{total, number} projekt letöltése..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
|
"message": "Frissítés befejezése..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.resolving-versions": {
|
||||||
|
"message": "Verziók meghatározása..."
|
||||||
},
|
},
|
||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "projekt"
|
"message": "projekt"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.locked-content": {
|
||||||
|
"message": "Zárolt példányokban a tartalom nem változtatható meg."
|
||||||
|
},
|
||||||
"app.instance.mods.project-was-added": {
|
"app.instance.mods.project-was-added": {
|
||||||
"message": " „{name}” hozzá lett adva"
|
"message": "„{name}” hozzá lett adva"
|
||||||
},
|
},
|
||||||
"app.instance.mods.projects-were-added": {
|
"app.instance.mods.projects-were-added": {
|
||||||
"message": "{count} projekt került hozzáadásra"
|
"message": "{count} projekt került hozzáadásra"
|
||||||
@@ -233,12 +422,69 @@
|
|||||||
"app.instance.mods.successfully-uploaded": {
|
"app.instance.mods.successfully-uploaded": {
|
||||||
"message": "Sikeresen feltöltve"
|
"message": "Sikeresen feltöltve"
|
||||||
},
|
},
|
||||||
|
"app.instance.share.empty.description": {
|
||||||
|
"message": "Ezt a példányt megoszthatod a barátaiddal!"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.heading": {
|
||||||
|
"message": "Nincsenek barátok meghívva"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.invite-friends-button": {
|
||||||
|
"message": "Barátok meghívása"
|
||||||
|
},
|
||||||
|
"app.instance.share.invite-modal.heading": {
|
||||||
|
"message": "{name} megosztása"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-prefix": {
|
||||||
|
"message": "Be kell jelentkezned mint"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-suffix": {
|
||||||
|
"message": ", hogy hozzáférj ehhez az oldalhoz."
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.linked-account-fallback": {
|
||||||
|
"message": "az összekapcsolt fiók"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.signed-out-heading": {
|
||||||
|
"message": "Nem vagy bejelentkezve"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.switch-account-button": {
|
||||||
|
"message": "Fiókváltás"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.wrong-account-heading": {
|
||||||
|
"message": "Helytelen fiók"
|
||||||
|
},
|
||||||
|
"app.instance.share.sign-in.button": {
|
||||||
|
"message": "Bejelentkezés"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.install-anyway": {
|
||||||
|
"message": "Telepítés mindenképpen"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.instance": {
|
||||||
|
"message": "Példány"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.sign-in-as-label": {
|
||||||
|
"message": "Bejelentkezés mint"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.signed-out-header": {
|
||||||
|
"message": "Be kell jelentkezned a Modrinth-ba"
|
||||||
|
},
|
||||||
"app.instance.worlds.add-server": {
|
"app.instance.worlds.add-server": {
|
||||||
"message": "Szerver hozzáadása"
|
"message": "Szerver hozzáadása"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.browse-servers": {
|
"app.instance.worlds.browse-servers": {
|
||||||
"message": "Szerverek böngészése"
|
"message": "Szerverek böngészése"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.delete-button": {
|
||||||
|
"message": "Világ törlése"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.title": {
|
||||||
|
"message": "Világ törlése"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
|
"message": "Ez a világ véglegesen törölve lesz ebből a játékpéldányból. Ezt NEM tudod visszavonni!"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
|
"message": "{name} törlése"
|
||||||
|
},
|
||||||
"app.instance.worlds.filter-modded": {
|
"app.instance.worlds.filter-modded": {
|
||||||
"message": "Modolt"
|
"message": "Modolt"
|
||||||
},
|
},
|
||||||
@@ -257,32 +503,50 @@
|
|||||||
"app.instance.worlds.no-worlds-heading": {
|
"app.instance.worlds.no-worlds-heading": {
|
||||||
"message": "Nincs szerver vagy világ"
|
"message": "Nincs szerver vagy világ"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.remove-button": {
|
||||||
|
"message": "Szerver eltávolítása"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.title": {
|
||||||
|
"message": "Szerver eltávolítása"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-body": {
|
||||||
|
"message": "Ez a szerver el lesz távolítva a szerverlistádból és a játékbeli szerverlistából is. Később újra hozzáadhatod, ha tudod a címet."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-header": {
|
||||||
|
"message": "{name} törlése"
|
||||||
|
},
|
||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Keresés {count} világ között..."
|
"message": "Keresés {count} világ között..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Szükséges tartalom"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Telepítés a játékhoz"
|
"message": "Telepítés a játékhoz"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Telepítés mindenképpen"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Telepítés"
|
"message": "Telepítés"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Ezt a meghívót nem a Modrinth, hanem egy másik Modrinth-felhasználó hozta létre. Csak olyan személyektől fogadd el a meghívásokat, akikben megbízol."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count} mod"
|
"message": "{count} mod"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "Szükséges modcsomag"
|
"message": "Egy fájlt csak akkor vizsgálnak meg, ha azt a Modrinth-en közzétették, függetlenül a fájlformátumtól (beleértve a .mrpack formátumot is)."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Ehhez a szerverhez modok szükségesek a játékhoz. Kattints a Telepítés gombra, hogy telepítsd a szükséges fájlokat a Modrinth-ról, majd indítsd el közvetlenül a szervert."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Megosztott profil"
|
"message": "Megosztott játékpéldány"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "Megosztott szerverprofil"
|
"message": "Ez a szerver-modpack olyan fájlokat tartalmaz, amelyek nem szerepelnek a Modrinth oldalon. Határozottan javasoljuk, hogy kizárólag olyan forrásokból telepíts fájlokat, amelyekben megbízol."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Figyelmeztetés ismeretlen fájlokról"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Felismerhetetlen fájlok"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Tartalom megtekintése"
|
"message": "Tartalom megtekintése"
|
||||||
@@ -290,20 +554,29 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Frissítsd a játékhoz"
|
"message": "Frissítsd a játékhoz"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "Frissítés szükséges"
|
"message": "Törölve"
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Frissítés szükséges ehhez: {name}. Kérlek, frissíts a legújabb verzióra a játék elindításához."
|
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Ez a projekt már telepítve van"
|
"message": "Ez a projekt már telepítve van"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Verzió váltása"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Vissza a böngészéshez"
|
"message": "Vissza a böngészéshez"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Tartalom telepítése a profilba"
|
"message": "Összes verzió"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Letöltés a böngészőben"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Telepítés..."
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Már le van töltve"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Fejlesztői mód bekapcsolva."
|
"message": "Fejlesztői mód bekapcsolva."
|
||||||
@@ -311,6 +584,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "v{version} letöltése"
|
"message": "v{version} letöltése"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "A hirdetések teszik lehetővé a Modrinth működését, és biztosítják a tartalomkészítők juttatásait. Partnereink sütiket tárolhatnak vagy érhetnek el az alkalmazásban a hirdetések személyre szabása és a teljesítmény mérése céljából. Az alábbiakban leiratkozhatsz erről, illetve beállíthatod a preferenciáidat."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Megjelenés"
|
"message": "Megjelenés"
|
||||||
},
|
},
|
||||||
@@ -353,6 +629,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Hiba a fájl feldolgozása közben"
|
"message": "Hiba a fájl feldolgozása közben"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Ez a kinézet az {ears} mod funkcióit használja"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Kinézet szerkesztése"
|
"message": "Kinézet szerkesztése"
|
||||||
},
|
},
|
||||||
@@ -416,9 +695,18 @@
|
|||||||
"app.skins.rate-limit.title": {
|
"app.skins.rate-limit.title": {
|
||||||
"message": "Lassíts!"
|
"message": "Lassíts!"
|
||||||
},
|
},
|
||||||
|
"app.skins.reorder-error.text": {
|
||||||
|
"message": "A kinézeted sorrendjét nem sikerült menteni."
|
||||||
|
},
|
||||||
|
"app.skins.reorder-error.title": {
|
||||||
|
"message": "A skinek átrendezése sikertelen"
|
||||||
|
},
|
||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -462,7 +750,7 @@
|
|||||||
"message": "Kérlek jelentkezz be a Minecraft-fiókodba, hogy használni tudd a Modrinth App kinézetkezelési funkcióit."
|
"message": "Kérlek jelentkezz be a Minecraft-fiókodba, hogy használni tudd a Modrinth App kinézetkezelési funkcióit."
|
||||||
},
|
},
|
||||||
"app.skins.sign-in.rinthbot-alt": {
|
"app.skins.sign-in.rinthbot-alt": {
|
||||||
"message": "Izgatott Modrinth-bot"
|
"message": "Izgatott Modrinth bot"
|
||||||
},
|
},
|
||||||
"app.skins.sign-in.title": {
|
"app.skins.sign-in.title": {
|
||||||
"message": "Kérlek jelentkezz be"
|
"message": "Kérlek jelentkezz be"
|
||||||
@@ -470,6 +758,12 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Kinézetváltó"
|
"message": "Kinézetváltó"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Kikapcsolás"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Bekapcsolás"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "A Modrinth App v{version} letöltése befejeződött. Frissítéshez válaszd ki a Frissítés opciót, vagy az alkalmazás a bezárásakor automatikusan frissül."
|
"message": "A Modrinth App v{version} letöltése befejeződött. Frissítéshez válaszd ki a Frissítés opciót, vagy az alkalmazás a bezárásakor automatikusan frissül."
|
||||||
},
|
},
|
||||||
@@ -581,6 +875,33 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Lépj be Modrinth fiókodba</link>, hogy felvehess barátokat és lásd mivel játszanak!"
|
"message": "<link>Lépj be Modrinth fiókodba</link>, hogy felvehess barátokat és lásd mivel játszanak!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Parancsikon létrehozása"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Modcsomag exportálása"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Játékpéldány elindítása"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "További műveletek"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Mappa megnyitása"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Javítás"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Játékpéldány-beállítások"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Indítás..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Leállítás..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Hozzáadás és csatlakozás"
|
"message": "Hozzáadás és csatlakozás"
|
||||||
},
|
},
|
||||||
@@ -588,7 +909,7 @@
|
|||||||
"message": "Szerver hozzáadása"
|
"message": "Szerver hozzáadása"
|
||||||
},
|
},
|
||||||
"instance.add-server.resource-pack.disabled": {
|
"instance.add-server.resource-pack.disabled": {
|
||||||
"message": "Kikapcsolva"
|
"message": "Letiltva"
|
||||||
},
|
},
|
||||||
"instance.add-server.resource-pack.enabled": {
|
"instance.add-server.resource-pack.enabled": {
|
||||||
"message": "Engedélyezve"
|
"message": "Engedélyezve"
|
||||||
@@ -597,13 +918,13 @@
|
|||||||
"message": "Mindig kérdezzen rá"
|
"message": "Mindig kérdezzen rá"
|
||||||
},
|
},
|
||||||
"instance.add-server.title": {
|
"instance.add-server.title": {
|
||||||
"message": "Adjon hozzá egy szervert"
|
"message": "Szerver hozzáadása"
|
||||||
},
|
},
|
||||||
"instance.edit-server.title": {
|
"instance.edit-server.title": {
|
||||||
"message": "Szerver módosítása"
|
"message": "Szerver módosítása"
|
||||||
},
|
},
|
||||||
"instance.edit-world.hide-from-home": {
|
"instance.edit-world.hide-from-home": {
|
||||||
"message": "Elrejtés a Főoldalról"
|
"message": "Elrejtés a kezdőlapról"
|
||||||
},
|
},
|
||||||
"instance.edit-world.name": {
|
"instance.edit-world.name": {
|
||||||
"message": "Név"
|
"message": "Név"
|
||||||
@@ -618,11 +939,14 @@
|
|||||||
"message": "Világ szerkesztése"
|
"message": "Világ szerkesztése"
|
||||||
},
|
},
|
||||||
"instance.files.adding-files": {
|
"instance.files.adding-files": {
|
||||||
"message": "Fájlok hozzáadása ({completed}/{total})"
|
"message": "Fájlok hozzáadása... ({completed}/{total})"
|
||||||
},
|
},
|
||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Mentés másként..."
|
"message": "Mentés másként..."
|
||||||
},
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Még nem játszott"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Cím"
|
"message": "Cím"
|
||||||
},
|
},
|
||||||
@@ -633,19 +957,19 @@
|
|||||||
"message": "Egy Minecraft szerver"
|
"message": "Egy Minecraft szerver"
|
||||||
},
|
},
|
||||||
"instance.server-modal.resource-pack": {
|
"instance.server-modal.resource-pack": {
|
||||||
"message": "Erőforráscsomag"
|
"message": "Forráscsomag"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general": {
|
"instance.settings.tabs.general": {
|
||||||
"message": "Általános"
|
"message": "Általános"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.delete": {
|
"instance.settings.tabs.general.delete": {
|
||||||
"message": "Profil törlése"
|
"message": "Játékpéldány törlése"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.delete.button": {
|
"instance.settings.tabs.general.delete.button": {
|
||||||
"message": "Profil törlése"
|
"message": "Játékpéldány törlése"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.delete.description": {
|
"instance.settings.tabs.general.delete.description": {
|
||||||
"message": "Örökké eltávolít egy profilt az eszközről, beleértve a világait, beállításait és minden telepített tartalmat. Legyen óvatos, mert ha egyszer kitöröl egy profilt, azt többé nem lehet visszaállítani."
|
"message": "Örökké eltávolít egy játékpéldányt az eszközről, beleértve a világait, beállításait és minden telepített tartalmat. Legyél óvatos, mert ha egyszer kitörölsz egy játékpéldányt, azt többé nem lehet visszaállítani."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.deleting.button": {
|
"instance.settings.tabs.general.deleting.button": {
|
||||||
"message": "Törlés..."
|
"message": "Törlés..."
|
||||||
@@ -657,10 +981,10 @@
|
|||||||
"message": "Telepítés közben nem lehet duplikálni."
|
"message": "Telepítés közben nem lehet duplikálni."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.duplicate-instance": {
|
"instance.settings.tabs.general.duplicate-instance": {
|
||||||
"message": "Profil duplikálása"
|
"message": "Játékpéldány duplikálása"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.duplicate-instance.description": {
|
"instance.settings.tabs.general.duplicate-instance.description": {
|
||||||
"message": "Készít egy másolatot erről a profilról, beleértve a világokat, beállításokat, modokat, stb."
|
"message": "Készít egy másolatot erről a játékpéldányról, beleértve a világokat, beállításokat, modokat stb."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.edit-icon": {
|
"instance.settings.tabs.general.edit-icon": {
|
||||||
"message": "Ikon szerkesztése"
|
"message": "Ikon szerkesztése"
|
||||||
@@ -675,16 +999,16 @@
|
|||||||
"message": "Ikon kiválasztása"
|
"message": "Ikon kiválasztása"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.library-groups": {
|
"instance.settings.tabs.general.library-groups": {
|
||||||
"message": "Könyvtár gyűjtemények"
|
"message": "Könyvtárgyűjtemények"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.library-groups.create": {
|
"instance.settings.tabs.general.library-groups.create": {
|
||||||
"message": "Új csoport létrehozása"
|
"message": "Új gyűjtemény létrehozása"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.library-groups.description": {
|
"instance.settings.tabs.general.library-groups.description": {
|
||||||
"message": "A könyvtárgyűjtemények segítenek külön kategóriákba rendszerezni a profiljait."
|
"message": "A könyvtárgyűjtemények segítenek külön kategóriákba rendszerezni a játékpéldányokat."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.library-groups.enter-name": {
|
"instance.settings.tabs.general.library-groups.enter-name": {
|
||||||
"message": "Adja meg a gyűjtemény nevét"
|
"message": "Add meg a gyűjtemény nevét"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.name": {
|
"instance.settings.tabs.general.name": {
|
||||||
"message": "Név"
|
"message": "Név"
|
||||||
@@ -708,10 +1032,10 @@
|
|||||||
"message": "Kiadás"
|
"message": "Kiadás"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.update-channel.release.description": {
|
"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."
|
"message": "Csak a kiadás verziók fognak megjelenni az elérhető frissítések között."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.update-channel.select": {
|
"instance.settings.tabs.general.update-channel.select": {
|
||||||
"message": "Válaszd ki a frissítési csatornát"
|
"message": "Frissítési csatorna kiválasztása"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks": {
|
"instance.settings.tabs.hooks": {
|
||||||
"message": "Indítási horgok"
|
"message": "Indítási horgok"
|
||||||
@@ -735,7 +1059,7 @@
|
|||||||
"message": "Indítás előtt"
|
"message": "Indítás előtt"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.pre-launch.description": {
|
"instance.settings.tabs.hooks.pre-launch.description": {
|
||||||
"message": "Futtatás a profil futtatása előtt."
|
"message": "Futtatás a játékpéldány futtatása előtt."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.pre-launch.enter": {
|
"instance.settings.tabs.hooks.pre-launch.enter": {
|
||||||
"message": "Írjon be indítás előtti parancsokat..."
|
"message": "Írjon be indítás előtti parancsokat..."
|
||||||
@@ -750,7 +1074,7 @@
|
|||||||
"message": "Indítóparancs a Minecraft elindításához."
|
"message": "Indítóparancs a Minecraft elindításához."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.wrapper.enter": {
|
"instance.settings.tabs.hooks.wrapper.enter": {
|
||||||
"message": "Írjon ide indítóparancsot..."
|
"message": "Add meg az indítóparancsot..."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.installation": {
|
"instance.settings.tabs.installation": {
|
||||||
"message": "Telepítés"
|
"message": "Telepítés"
|
||||||
@@ -795,7 +1119,7 @@
|
|||||||
"message": "Hozzárendelt memória"
|
"message": "Hozzárendelt memória"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.java.java-path-placeholder": {
|
"instance.settings.tabs.java.java-path-placeholder": {
|
||||||
"message": "/path/to/java"
|
"message": "/eleresi/ut/a/javahoz"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window": {
|
"instance.settings.tabs.window": {
|
||||||
"message": "Ablak"
|
"message": "Ablak"
|
||||||
@@ -807,7 +1131,7 @@
|
|||||||
"message": "Teljes képernyő"
|
"message": "Teljes képernyő"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.fullscreen.description": {
|
"instance.settings.tabs.window.fullscreen.description": {
|
||||||
"message": "A játék indításakor teljes képernyős módban indítsa el (az options.txt fájl segítségével)."
|
"message": "A játék az indításakor teljes képernyős módban indul el (az options.txt fájl segítségével)."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.height": {
|
"instance.settings.tabs.window.height": {
|
||||||
"message": "Magasság"
|
"message": "Magasság"
|
||||||
@@ -816,7 +1140,7 @@
|
|||||||
"message": "A játék ablakának magassága indításkor."
|
"message": "A játék ablakának magassága indításkor."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.height.enter": {
|
"instance.settings.tabs.window.height.enter": {
|
||||||
"message": "Magaság megadása..."
|
"message": "Magasság megadása..."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.width": {
|
"instance.settings.tabs.window.width": {
|
||||||
"message": "Szélesség"
|
"message": "Szélesség"
|
||||||
@@ -836,11 +1160,14 @@
|
|||||||
"instance.worlds.copy_address": {
|
"instance.worlds.copy_address": {
|
||||||
"message": "Cím másolása"
|
"message": "Cím másolása"
|
||||||
},
|
},
|
||||||
|
"instance.worlds.create_shortcut": {
|
||||||
|
"message": "Parancsikon létrehozása"
|
||||||
|
},
|
||||||
"instance.worlds.dont_show_on_home": {
|
"instance.worlds.dont_show_on_home": {
|
||||||
"message": "Ne mutasd a kezdőlapon"
|
"message": "Ne mutasd a kezdőlapon"
|
||||||
},
|
},
|
||||||
"instance.worlds.game_already_open": {
|
"instance.worlds.game_already_open": {
|
||||||
"message": "A példány már el van indítva"
|
"message": "A játékpéldány már el van indítva"
|
||||||
},
|
},
|
||||||
"instance.worlds.hardcore": {
|
"instance.worlds.hardcore": {
|
||||||
"message": "Hardcore mód"
|
"message": "Hardcore mód"
|
||||||
@@ -861,10 +1188,10 @@
|
|||||||
"message": "Csak Minecraft 1.20+-tól tudsz egyből egyjátékos világba belépni"
|
"message": "Csak Minecraft 1.20+-tól tudsz egyből egyjátékos világba belépni"
|
||||||
},
|
},
|
||||||
"instance.worlds.play_instance": {
|
"instance.worlds.play_instance": {
|
||||||
"message": "Játék a profillal"
|
"message": "Játékpéldány indítása"
|
||||||
},
|
},
|
||||||
"instance.worlds.view_instance": {
|
"instance.worlds.view_instance": {
|
||||||
"message": "Példány megtekintése"
|
"message": "Játékpéldány megtekintése"
|
||||||
},
|
},
|
||||||
"instance.worlds.world_in_use": {
|
"instance.worlds.world_in_use": {
|
||||||
"message": "A világ használatban van"
|
"message": "A világ használatban van"
|
||||||
@@ -887,49 +1214,49 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Bejelentkezés a Minecraftba"
|
"message": "Bejelentkezés a Minecraftba"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "A játék elindításához és játszásához szükséged van egy olyan Microsoft-fiókra, amelyhez a Minecraft tartozik."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Bejelentkezés egy Microsoft-fiókba"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Még nincs fiókod?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Szerezd be a Minecraftot!"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Támogatás"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft szükséges"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Bejelentkezés a Microsft-ba"
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Pédány által megadva"
|
"message": "A játékpéldány által van megadva"
|
||||||
},
|
},
|
||||||
"search.filter.locked.instance-game-version.title": {
|
"search.filter.locked.instance-game-version.title": {
|
||||||
"message": "A játékverziót az adott példány biztosítja"
|
"message": "A játékverziót az adott játékpéldány biztosítja"
|
||||||
},
|
},
|
||||||
"search.filter.locked.instance-loader.title": {
|
"search.filter.locked.instance-loader.title": {
|
||||||
"message": "A betöltőt az adott példány biztosítja"
|
"message": "A betöltőt az adott játékpéldány biztosítja"
|
||||||
},
|
},
|
||||||
"search.filter.locked.instance.sync": {
|
"search.filter.locked.instance.sync": {
|
||||||
"message": "Profil szinkronizálása"
|
"message": "Szinkronizálás a játékpéldánnyal"
|
||||||
},
|
},
|
||||||
"search.filter.locked.server": {
|
"search.filter.locked.server": {
|
||||||
"message": "A szerver által van megadva"
|
"message": "A szerver által van megadva"
|
||||||
},
|
},
|
||||||
"search.filter.locked.server-environment.title": {
|
"search.filter.locked.server-environment.title": {
|
||||||
"message": "Csak kliensoldali modok adhatók hozzá a szerverprofilhoz"
|
"message": "Csak kliensoldali modok adhatók hozzá a szerverpéldányhoz"
|
||||||
},
|
},
|
||||||
"search.filter.locked.server-game-version.title": {
|
"search.filter.locked.server-game-version.title": {
|
||||||
"message": "A játékverziót a szerver biztosítja"
|
"message": "A játékverziót az adott szerver biztosítja"
|
||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "A betöltőt a szerver biztosítja"
|
"message": "A betöltőt az adott szerver biztosítja"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Egy fájlt csak akkor vizsgálunk meg, ha azt feltöltik a Modrinthra, függetlenül a fájlformátumtól (beleértve a .mrpack formátumot is)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Ne mutasd újra ezt a figyelmeztetést"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Telepítés megerősítése"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Letöltés mindenképpen"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "A rosszindulatú programokat gyakran modcsomag-fájlokon keresztül terjesztik, például a Discordhoz hasonló platformokon történő megosztás révén."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Ezt a fájlt nem találtuk meg a Modrinthon. Határozottan javasoljuk, hogy kizárólag megbízható forrásokból származó fájlokat telepíts."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Figyelmeztetés ismeretlen fájlról"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -146,9 +146,6 @@
|
|||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Temukan server"
|
"message": "Temukan server"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
|
||||||
"message": "Sembunyikan server yang sudah ditambah"
|
|
||||||
},
|
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Paket Mod"
|
"message": "Paket Mod"
|
||||||
},
|
},
|
||||||
@@ -170,9 +167,6 @@
|
|||||||
"app.export-modal.header": {
|
"app.export-modal.header": {
|
||||||
"message": "Ekspor paket mod"
|
"message": "Ekspor paket mod"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
|
||||||
"message": "Nama Paket Mod"
|
|
||||||
},
|
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Nama paket mod"
|
"message": "Nama paket mod"
|
||||||
},
|
},
|
||||||
@@ -251,9 +245,6 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Cari {count} dunia..."
|
"message": "Cari {count} dunia..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Konten diperlukan"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Pasang untuk memainkan"
|
"message": "Pasang untuk memainkan"
|
||||||
},
|
},
|
||||||
@@ -263,39 +254,21 @@
|
|||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, other {# mod}}"
|
"message": "{count, plural, other {# mod}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
|
||||||
"message": "Paket mod yang diperlukan"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Mod diperlukan untuk bermain di server ini. Klik pasang untuk menyiapkan berkas-berkas yang diperlukan dari Modrinth, kemudian luncurkan langsung sari server."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Instans terbagi"
|
"message": "Instans terbagi"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Instans server terbagi"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Lihat konten"
|
"message": "Lihat konten"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Perbarui untuk memainkan"
|
"message": "Perbarui untuk memainkan"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "Perlu diperbarui"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "{name} perlu diperbarui sebelum dimainkan. Mohon perbarui ke versi terkini untuk meluncurkan permainan."
|
|
||||||
},
|
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Proyek ini sudah terpasang"
|
"message": "Proyek ini sudah terpasang"
|
||||||
},
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Kembali ke halaman pencarian"
|
"message": "Kembali ke halaman pencarian"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
|
||||||
"message": "Pasang konten ke instans"
|
|
||||||
},
|
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Mode pengembang dihidupkan."
|
"message": "Mode pengembang dihidupkan."
|
||||||
},
|
},
|
||||||
@@ -907,26 +880,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Pemuat disediakan oleh server"
|
"message": "Pemuat disediakan oleh server"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Berkas hanya akan ditinjau bila ia diunggah ke Modrinth, tak peduli format berkasnya (termasuk .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Jangan tampilkan peringatan ini lagi"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Konfirmasi pemasangan"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Tetap pasang"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Program jahat (malware) dibagikan melalui berkas paket mod dengan membagikannya melalui platform seperti Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Kami tidak dapat menemukan berkas ini di Modrinth. Kami sangat menyarankan Anda untuk hanya memasang berkas dari sumber-sumber terpercaya."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Peringatan berkas tidak dikenal"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Mostra meno istanze in esecuzione"
|
"message": "Mostra meno istanze in esecuzione"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Copiati"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Copia dettagli"
|
||||||
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Ignora"
|
"message": "Ignora"
|
||||||
},
|
},
|
||||||
@@ -20,9 +26,72 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Riprova"
|
"message": "Riprova"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Annullato per app chiusa"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Impossibile leggere il pacchetto"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Annullato"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "La pulizia è stata interrotta"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Impossibile scaricare i file"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Il file scaricato è corrotto"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Impossibile salvare i file"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "Il download è stato interrotto"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "L'istanza non è stata trovata"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "Percorso del file errato"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Dati del pacchetto non validi"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Metadati del pacchetto non validi"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "La configurazione di Java è stata interrotta"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "Il loader non è stato configurato"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Impossibile aggiornare i dati locali"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "Minecraft non è stato configurato"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Impossibile collegarsi a Modrinth"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Permessi di scrittura mancanti"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Impossibile scaricare il pacchetto"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Qualcosa è andato storto"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Istanza sconosciuta"
|
"message": "Istanza sconosciuta"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.updating-shared-content": {
|
||||||
|
"message": "Aggiornando i contenuti condivisi"
|
||||||
|
},
|
||||||
"app.action-bar.installs": {
|
"app.action-bar.installs": {
|
||||||
"message": "Installazioni"
|
"message": "Installazioni"
|
||||||
},
|
},
|
||||||
@@ -39,13 +108,13 @@
|
|||||||
"message": "Primaria"
|
"message": "Primaria"
|
||||||
},
|
},
|
||||||
"app.action-bar.reload-to-update": {
|
"app.action-bar.reload-to-update": {
|
||||||
"message": "Ricarica per aggiornare"
|
"message": "Riavvia"
|
||||||
},
|
},
|
||||||
"app.action-bar.show-more-running-instances": {
|
"app.action-bar.show-more-running-instances": {
|
||||||
"message": "Mostra più istanze in esecuzione"
|
"message": "Mostra più istanze in esecuzione"
|
||||||
},
|
},
|
||||||
"app.action-bar.stop-instance": {
|
"app.action-bar.stop-instance": {
|
||||||
"message": "Ferma l'istanza"
|
"message": "Arresta l'istanza"
|
||||||
},
|
},
|
||||||
"app.action-bar.update": {
|
"app.action-bar.update": {
|
||||||
"message": "Aggiorna"
|
"message": "Aggiorna"
|
||||||
@@ -59,6 +128,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Mostra i log"
|
"message": "Mostra i log"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Accetta tutto"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Le pubblicità aiutano Modrinth a crescere e a finanziare i creatori. I nostri partner potrebbero memorizzare o accedere ai cookie nell'app per personalizzare e misurarne le prestazioni."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Gestisci le opzioni"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Rifiuta tutto"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "La tua privacy e come le pubblicità supportano Modrinth"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Abilita alcuni effetti come la sfocatura, ma può causare problemi di prestazioni senza accelerazione hardware."
|
"message": "Abilita alcuni effetti come la sfocatura, ma può causare problemi di prestazioni senza accelerazione hardware."
|
||||||
},
|
},
|
||||||
@@ -120,7 +204,7 @@
|
|||||||
"message": "Salta automaticamente le conferme a basso rischio, come l'installazione di pacchetti di mod duplicati, la normale eliminazione di contenuti, gli aggiornamenti simultanei, lo scollegare i pacchetti di mod e le richieste di riparazione. Le avvertenze verranno comunque mostrate."
|
"message": "Salta automaticamente le conferme a basso rischio, come l'installazione di pacchetti di mod duplicati, la normale eliminazione di contenuti, gli aggiornamenti simultanei, lo scollegare i pacchetti di mod e le richieste di riparazione. Le avvertenze verranno comunque mostrate."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.skip-non-essential-warnings.title": {
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
"message": "Salta le conferme poco importanti"
|
"message": "Salta le conferme meno importanti"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "Mostra o nascondi la barra laterale."
|
"message": "Mostra o nascondi la barra laterale."
|
||||||
@@ -132,7 +216,7 @@
|
|||||||
"message": "Mostrerà un avviso prima di installare un file Modrinth Pack (.mrpack) non proveniente da Modrinth, a causa dei possibili rischi."
|
"message": "Mostrerà un avviso prima di installare un file Modrinth Pack (.mrpack) non proveniente da Modrinth, a causa dei possibili rischi."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.unknown-pack-warning.title": {
|
"app.appearance-settings.unknown-pack-warning.title": {
|
||||||
"message": "Avvisami se installo pacchetti sconosciuti"
|
"message": "Avvisami quando installo pacchetti sconosciuti"
|
||||||
},
|
},
|
||||||
"app.auth-servers.unreachable.body": {
|
"app.auth-servers.unreachable.body": {
|
||||||
"message": "I server di autenticazione di Minecraft stanno riscontrando problemi. Controlla la tua connessione a Internet e riprova più tardi."
|
"message": "I server di autenticazione di Minecraft stanno riscontrando problemi. Controlla la tua connessione a Internet e riprova più tardi."
|
||||||
@@ -165,7 +249,7 @@
|
|||||||
"message": "Esplora i contenuti"
|
"message": "Esplora i contenuti"
|
||||||
},
|
},
|
||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Esplora i server"
|
"message": "Sfoglia i server"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "Nascondi server già aggiunti"
|
"message": "Nascondi server già aggiunti"
|
||||||
@@ -213,13 +297,13 @@
|
|||||||
"message": "Download del pacchetto"
|
"message": "Download del pacchetto"
|
||||||
},
|
},
|
||||||
"app.install.phase.extracting_overrides": {
|
"app.install.phase.extracting_overrides": {
|
||||||
"message": "Estrazione degli override"
|
"message": "Estrazione delle sovrascritture"
|
||||||
},
|
},
|
||||||
"app.install.phase.finalizing": {
|
"app.install.phase.finalizing": {
|
||||||
"message": "Finalizzazione"
|
"message": "Finalizzazione"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Preparazione dell'istanza"
|
"message": "In coda per l'installazione"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Preparazione di Java"
|
"message": "Preparazione di Java"
|
||||||
@@ -252,11 +336,41 @@
|
|||||||
"message": "Risoluzione dei contenuti"
|
"message": "Risoluzione dei contenuti"
|
||||||
},
|
},
|
||||||
"app.install.phase.rolling_back": {
|
"app.install.phase.rolling_back": {
|
||||||
"message": "Tornando indietro"
|
"message": "Annullamento"
|
||||||
},
|
},
|
||||||
"app.install.phase.running_loader_processors": {
|
"app.install.phase.running_loader_processors": {
|
||||||
"message": "Esecuzione dei processori del loader"
|
"message": "Esecuzione dei processori del loader"
|
||||||
},
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.added-label": {
|
||||||
|
"message": "Aggiunto"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-body": {
|
||||||
|
"message": "L'istanza locale è più avanti di quella degli utenti che hai invitato."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-header": {
|
||||||
|
"message": "Le modifiche non sono ancora state condivise"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publish-button": {
|
||||||
|
"message": "Invia"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publishing-button": {
|
||||||
|
"message": "Invio..."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.removed-label": {
|
||||||
|
"message": "Rimosso"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-admonition-header": {
|
||||||
|
"message": "Invia aggiornamento"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-description": {
|
||||||
|
"message": "Revisiona i contenuti modificati che verranno condivisi con l'intera istanza."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-header": {
|
||||||
|
"message": "Revisiona modifiche"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.reviewing-button": {
|
||||||
|
"message": "Revisione..."
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Tutti i dati della tua istanza verranno eliminati permanentemente, inclusi i tuoi mondi, configurazioni e tutti i contenuti installati."
|
"message": "Tutti i dati della tua istanza verranno eliminati permanentemente, inclusi i tuoi mondi, configurazioni e tutti i contenuti installati."
|
||||||
},
|
},
|
||||||
@@ -293,6 +407,9 @@
|
|||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "progetto"
|
"message": "progetto"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.locked-content": {
|
||||||
|
"message": "I contenuti nelle istanze bloccate non possono essere modificati."
|
||||||
|
},
|
||||||
"app.instance.mods.project-was-added": {
|
"app.instance.mods.project-was-added": {
|
||||||
"message": "\"{name}\" è stato aggiunto"
|
"message": "\"{name}\" è stato aggiunto"
|
||||||
},
|
},
|
||||||
@@ -305,11 +422,107 @@
|
|||||||
"app.instance.mods.successfully-uploaded": {
|
"app.instance.mods.successfully-uploaded": {
|
||||||
"message": "Caricato con successo"
|
"message": "Caricato con successo"
|
||||||
},
|
},
|
||||||
|
"app.instance.share.empty.description": {
|
||||||
|
"message": "Invita chi vuoi a questa istanza!"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.heading": {
|
||||||
|
"message": "Nessun invito inviato"
|
||||||
|
},
|
||||||
|
"app.instance.share.empty.invite-friends-button": {
|
||||||
|
"message": "Invia un invito"
|
||||||
|
},
|
||||||
|
"app.instance.share.invite-modal.heading": {
|
||||||
|
"message": "Condividi {name}"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-prefix": {
|
||||||
|
"message": "Devi effettuare l'accesso come"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.empty-description-suffix": {
|
||||||
|
"message": "per accedere a questa pagina."
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.linked-account-fallback": {
|
||||||
|
"message": "l'account collegato"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.signed-out-heading": {
|
||||||
|
"message": "Accesso non effettuato"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.switch-account-button": {
|
||||||
|
"message": "Cambia account"
|
||||||
|
},
|
||||||
|
"app.instance.share.locked.wrong-account-heading": {
|
||||||
|
"message": "Account sbagliato"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-access": {
|
||||||
|
"message": "Non riceveranno più gli aggiornamenti di questa istanza condivisa"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-installed-copy": {
|
||||||
|
"message": "La copia che hanno già nei loro dispositivi rimarrà"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-invite-again": {
|
||||||
|
"message": "Puoi reinvitarli più tardi"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effect-last-user": {
|
||||||
|
"message": "Questo è l'ultimo utente, la condivisione verrà spenta per questa istanza"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.effects-label": {
|
||||||
|
"message": "Cosa succede?"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.header": {
|
||||||
|
"message": "Revoca accesso"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.remove-button": {
|
||||||
|
"message": "Revoca accesso"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.user-avatar-alt": {
|
||||||
|
"message": "Foto profilo di {username}"
|
||||||
|
},
|
||||||
|
"app.instance.share.remove-user-modal.warning-body": {
|
||||||
|
"message": "Se revochi l'accesso di {username} a questa istanza condivisa, dovrai reinvitarli prima che ricevano gli aggiornamenti."
|
||||||
|
},
|
||||||
|
"app.instance.share.sign-in.button": {
|
||||||
|
"message": "Accedi"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.body": {
|
||||||
|
"message": "Devi scollegare questo pacchetto per condividere l'istanza"
|
||||||
|
},
|
||||||
|
"app.instance.share.unlink.header": {
|
||||||
|
"message": "Scollega prima di condividere"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.body": {
|
||||||
|
"message": "Questa istanza condivisa è già installata come <bold>{instanceName}</bold>. Vuoi installarne un'altra copia?"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.header": {
|
||||||
|
"message": "Istanza condivisa già installata"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.install-anyway": {
|
||||||
|
"message": "Installa comunque"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-already-installed.instance": {
|
||||||
|
"message": "Istanza"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.fallback-username": {
|
||||||
|
"message": "l'account collegato"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.owner-admonition-body-v2": {
|
||||||
|
"message": "per gestire l'istanza condivisa. Non potrai inviare gli aggiornamenti agli utenti."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.sign-in-as-label": {
|
||||||
|
"message": "Accedi come"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.signed-out-header": {
|
||||||
|
"message": "Devi aver effettuato l'accesso a Modrinth"
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.user-admonition-body-v2": {
|
||||||
|
"message": "per ricevere gli aggiornamenti dell'istanza condivisa."
|
||||||
|
},
|
||||||
|
"app.instance.shared-instance-wrong-account.warning-header": {
|
||||||
|
"message": "Stai usando l'account Modrinth sbagliato"
|
||||||
|
},
|
||||||
"app.instance.worlds.add-server": {
|
"app.instance.worlds.add-server": {
|
||||||
"message": "Aggiungi server"
|
"message": "Aggiungi server"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.browse-servers": {
|
"app.instance.worlds.browse-servers": {
|
||||||
"message": "Esplora i server"
|
"message": "Sfoglia i server"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.delete-world-modal.delete-button": {
|
"app.instance.worlds.delete-world-modal.delete-button": {
|
||||||
"message": "Elimina mondo"
|
"message": "Elimina mondo"
|
||||||
@@ -318,7 +531,7 @@
|
|||||||
"message": "Eliminare il mondo"
|
"message": "Eliminare il mondo"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.delete-world-modal.warning-body": {
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
"message": "Questo mondo verrà eliminato permanentemente da questa istanza. Questa azione non può essere annullata."
|
"message": "Questo mondo verrà eliminato permanentemente dall'istanza. Questa azione non può essere annullata."
|
||||||
},
|
},
|
||||||
"app.instance.worlds.delete-world-modal.warning-header": {
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
"message": "Eliminare {name}"
|
"message": "Eliminare {name}"
|
||||||
@@ -336,7 +549,7 @@
|
|||||||
"message": "Vanilla"
|
"message": "Vanilla"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.no-worlds-description": {
|
"app.instance.worlds.no-worlds-description": {
|
||||||
"message": "Inizia esplorando o aggiungendo un server"
|
"message": "Inizia sfogliando o aggiungendo un server"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.no-worlds-heading": {
|
"app.instance.worlds.no-worlds-heading": {
|
||||||
"message": "Nessun server o mondo aggiunto"
|
"message": "Nessun server o mondo aggiunto"
|
||||||
@@ -356,29 +569,89 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Cerca tra {count} mondi..."
|
"message": "Cerca tra {count} mondi..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
"app.modal.install-to-play.additional-context": {
|
||||||
"message": "Contenuto richiesto"
|
"message": "Contesto aggiuntivo"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.additional-context-placeholder": {
|
||||||
|
"message": "Se possibile, includi link e immagini pertinenti"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.content-you-are-reporting": {
|
||||||
|
"message": "L'istanza che stai segnalando"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.delete-instance": {
|
||||||
|
"message": "Elimina istanza"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.external-files-dont-install": {
|
||||||
|
"message": "Non installare"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Installa per continuare"
|
"message": "Installa per continuare"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Installa comunque"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Installa"
|
"message": "Installa"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Questo invito è stato creato da un utente e non da Modrinth. Accetta solo gli inviti da persone fidate."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count} mod"
|
"message": "{count} mod"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.report-description": {
|
||||||
"message": "Pacchetto di mod richiesto"
|
"message": "Usa questo modulo per segnalare le istanze che violano le nostre <rules-link>Regole</rules-link> o <terms-link>Termini d'uso</terms-link>."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
"app.modal.install-to-play.report-image-invalid-type": {
|
||||||
"message": "Questo server richiede alcune mod. Clicca Installa per scaricarle direttamente da Modrinth, poi sarai pronto a giocare."
|
"message": "Il file non è un'immagine supportata"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-image-too-large": {
|
||||||
|
"message": "Il file supera il limite di 1 MiB"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-legal-claims": {
|
||||||
|
"message": "Per DMCA o altre rivendicazioni legali, controlla la nostra <copyright-link>Politica copyright</copyright-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason": {
|
||||||
|
"message": "Quale regola è violata da quest'istanza?"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.inappropriate": {
|
||||||
|
"message": "Inappropriato"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.malicious": {
|
||||||
|
"message": "Dannoso"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-reason.spam": {
|
||||||
|
"message": "Spam"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-shared-instance-header": {
|
||||||
|
"message": "Segnala istanza condivisa"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-submitted": {
|
||||||
|
"message": "Segnalazione inviata"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.report-support-and-bugs": {
|
||||||
|
"message": "Per assistenza, contatta il nostro <support-link>team di assistenza</support-link>. Per segnalare bug, apri un <github-link>Issue su GitHub</github-link>."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
|
"message": "Solo i file pubblicati su Modrinth vengono esaminati, qualunque sia il loro formato (.mrpack inclusi)."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Istanza condivisa"
|
"message": "Istanza condivisa"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.shared-instance-content": {
|
||||||
"message": "Istanza del server condivisa"
|
"message": "Contenuti istanza condivisa"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "L'istanza condivisa contiene dei file che non sono su Modrinth. Consigliamo di installare file solo da fonti attendibili."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
|
"message": "Il pacchetto contiene dei file che non sono su Modrinth. Consigliamo di installare file solo da fonti attendibili."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "File sconosciuti"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "File non riconosciuti"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Mostra contenuti"
|
"message": "Mostra contenuti"
|
||||||
@@ -386,6 +659,21 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Aggiorna per continuare"
|
"message": "Aggiorna per continuare"
|
||||||
},
|
},
|
||||||
|
"app.modal.update-to-play.removed": {
|
||||||
|
"message": "Rimosso"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.server-modpack-unknown-files-description": {
|
||||||
|
"message": "L'aggiornamento del pacchetto contiene dei file che non sono su Modrinth. Consigliamo di installare file solo da fonti attendibili."
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-added-label": {
|
||||||
|
"message": "Aggiunto"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-removed-label": {
|
||||||
|
"message": "Rimosso"
|
||||||
|
},
|
||||||
|
"app.modal.update-to-play.shared-instance-unknown-files-description": {
|
||||||
|
"message": "L'aggiornamento dell'istanza condivisa contiene dei file che non sono su Modrinth. Consigliamo di installare file solo da fonti attendibili."
|
||||||
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.update-required": {
|
||||||
"message": "Aggiornamento richiesto"
|
"message": "Aggiornamento richiesto"
|
||||||
},
|
},
|
||||||
@@ -395,11 +683,23 @@
|
|||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Questo progetto è già stato installato"
|
"message": "Questo progetto è già stato installato"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Cambia versione"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Torna a Esplora"
|
"message": "Torna a Esplora"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Installa il contenuto nell'istanza"
|
"message": "Tutte le versioni"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Scarica dal browser"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Installazione"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Già installata"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Modalità sviluppatore attiva."
|
"message": "Modalità sviluppatore attiva."
|
||||||
@@ -407,6 +707,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "Scaricando v{version}"
|
"message": "Scaricando v{version}"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Le pubblicità aiutano Modrinth a crescere e a finanziare i creatori. I nostri partner potrebbero memorizzare o accedere ai cookie nell'app per personalizzare e misurarne le prestazioni. Di seguito puoi scegliere di disdire o di gestire le opzioni."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Aspetto"
|
"message": "Aspetto"
|
||||||
},
|
},
|
||||||
@@ -449,6 +752,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Impossibile processare il file"
|
"message": "Impossibile processare il file"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Questa skin usa caratteristiche della mod {ears}"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Modifica"
|
"message": "Modifica"
|
||||||
},
|
},
|
||||||
@@ -492,7 +798,7 @@
|
|||||||
"message": "Salva"
|
"message": "Salva"
|
||||||
},
|
},
|
||||||
"app.skins.modal.saving-tooltip": {
|
"app.skins.modal.saving-tooltip": {
|
||||||
"message": "Salvando..."
|
"message": "Salvataggio..."
|
||||||
},
|
},
|
||||||
"app.skins.modal.texture-section": {
|
"app.skins.modal.texture-section": {
|
||||||
"message": "Aspetto"
|
"message": "Aspetto"
|
||||||
@@ -521,6 +827,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -572,8 +881,14 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Seleziona una skin"
|
"message": "Seleziona una skin"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Disattiva"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Attiva"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App v{version} è stata scaricata. Ricarica per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
|
"message": "Modrinth App v{version} è stata scaricata. Riavvia per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
|
||||||
},
|
},
|
||||||
"app.update-popup.body.linux": {
|
"app.update-popup.body.linux": {
|
||||||
"message": "Modrinth App v{version} è disponibile. Usa il tuo gestore di pacchetti per aggiornare e ricevere le novità più recenti!"
|
"message": "Modrinth App v{version} è disponibile. Usa il tuo gestore di pacchetti per aggiornare e ricevere le novità più recenti!"
|
||||||
@@ -591,7 +906,7 @@
|
|||||||
"message": "Download completato"
|
"message": "Download completato"
|
||||||
},
|
},
|
||||||
"app.update-popup.reload": {
|
"app.update-popup.reload": {
|
||||||
"message": "Ricarica"
|
"message": "Riavvia"
|
||||||
},
|
},
|
||||||
"app.update-popup.title": {
|
"app.update-popup.title": {
|
||||||
"message": "Aggiornamento disponibile"
|
"message": "Aggiornamento disponibile"
|
||||||
@@ -620,6 +935,39 @@
|
|||||||
"app.world.world-item.players-online": {
|
"app.world.world-item.players-online": {
|
||||||
"message": "{count} online"
|
"message": "{count} online"
|
||||||
},
|
},
|
||||||
|
"content.shared-instance.change-version-body": {
|
||||||
|
"message": "Modificare la versione cambia solo la copia locale. Gli aggiornamenti condivisi futuri potrebbero rimodificarla."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-bulk-body": {
|
||||||
|
"message": "Alcuni progetti selezionati fanno parte dell'istanza condivisa. Eliminarli cambia solo la copia locale, e gli aggiornamenti condivisi futuri potrebbero ripristinarli."
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-button": {
|
||||||
|
"message": "Elimina comunque"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-many-button": {
|
||||||
|
"message": "Elimina {count, number} progetti comunque"
|
||||||
|
},
|
||||||
|
"content.shared-instance.delete-single-body": {
|
||||||
|
"message": "Eliminarlo cambia solo la copia locale. Gli aggiornamenti condivisi futuri potrebbero ripristinarlo."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-bulk-body": {
|
||||||
|
"message": "Alcuni progetti selezionati fanno parte dell'istanza condivisa. Disabilitarli cambia solo la copia locale, e gli aggiornamenti condivisi futuri potrebbero riabilitarli."
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-button": {
|
||||||
|
"message": "Disabilita comunque"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-many-button": {
|
||||||
|
"message": "Disabilita {count, number} progetti comunque"
|
||||||
|
},
|
||||||
|
"content.shared-instance.disable-single-body": {
|
||||||
|
"message": "Disabilitarlo cambia solo la copia locale. Gli aggiornamenti condivisi futuri potrebbero riabilitarlo."
|
||||||
|
},
|
||||||
|
"content.shared-instance.unlink-body": {
|
||||||
|
"message": "Scollegarlo cambia solo la copia locale. Gli aggiornamenti condivisi futuri potrebbero ricollegarlo."
|
||||||
|
},
|
||||||
|
"content.shared-instance.warning-header": {
|
||||||
|
"message": "Questo fa parte dell'istanza condivisa"
|
||||||
|
},
|
||||||
"friends.action.add-friend": {
|
"friends.action.add-friend": {
|
||||||
"message": "Stringi un'amicizia"
|
"message": "Stringi un'amicizia"
|
||||||
},
|
},
|
||||||
@@ -636,10 +984,10 @@
|
|||||||
"message": "Potrebbe essere diverso dal nome utente di Minecraft!"
|
"message": "Potrebbe essere diverso dal nome utente di Minecraft!"
|
||||||
},
|
},
|
||||||
"friends.add-friend.username.placeholder": {
|
"friends.add-friend.username.placeholder": {
|
||||||
"message": "Inserisci il nome utente Modrinth..."
|
"message": "Nome utente di Modrinth..."
|
||||||
},
|
},
|
||||||
"friends.add-friend.username.title": {
|
"friends.add-friend.username.title": {
|
||||||
"message": "Con quale utente Modrinth vuoi stringere l'amicizia?"
|
"message": "Con quale utente di Modrinth vuoi stringere amicizia?"
|
||||||
},
|
},
|
||||||
"friends.add-friends-to-share": {
|
"friends.add-friends-to-share": {
|
||||||
"message": "<link>Stringi un''amicizia</link> per sapere a cosa stanno giocando!"
|
"message": "<link>Stringi un''amicizia</link> per sapere a cosa stanno giocando!"
|
||||||
@@ -683,6 +1031,75 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Accedi a un account Modrinth</link> per stringere amicizie e sapere a cosa stanno giocando!"
|
"message": "<link>Accedi a un account Modrinth</link> per stringere amicizie e sapere a cosa stanno giocando!"
|
||||||
},
|
},
|
||||||
|
"installation-settings.shared-instance.linked-title": {
|
||||||
|
"message": "Istanza condivisa collegata"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.title": {
|
||||||
|
"message": "Rimuovi l'istanza dai server"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-button": {
|
||||||
|
"message": "Scollega l'istanza condivisa"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlink-description": {
|
||||||
|
"message": "Sconnetti l'istanza locale dai prossimi aggiornamenti condivisi."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unlinking-button": {
|
||||||
|
"message": "Scollegamento..."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-button": {
|
||||||
|
"message": "Rimuovi l'istanza condivisa dai server"
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublish-description": {
|
||||||
|
"message": "Rimuovi l'istanza condivisa da Modrinth e non inviare più aggiornamenti a chi la usa. L'istanza locale non sarà toccata."
|
||||||
|
},
|
||||||
|
"installation-settings.shared-instance.unpublishing-button": {
|
||||||
|
"message": "Rimozione..."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "Ciò influirà solo sull'istanza locale. I contenuti installati rimarranno sul dispositivo e l'istanza condivisa e gli utenti che la usano non verranno toccati."
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Scollegare l'istanza condivisa"
|
||||||
|
},
|
||||||
|
"installation-settings.unlink-shared-instance.modal.header": {
|
||||||
|
"message": "Scollega l'istanza condivisa"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-body": {
|
||||||
|
"message": "Ciò eliminerà l'istanza condivisa dai server di Modrinth. Gli utenti che la usavano non riceveranno più aggiornamenti, ma l'istanza locale e i contenuti rimarranno su questo dispositivo."
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.admonition-header": {
|
||||||
|
"message": "Rimuovere l'istanza condivisa dai server"
|
||||||
|
},
|
||||||
|
"installation-settings.unpublish-shared-instance.modal.header": {
|
||||||
|
"message": "Rimuovi l'istanza condivisa dai server"
|
||||||
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Crea collegamento"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Esporta pacchetto"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Avvia istanza"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "Altre azioni"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Apri cartella"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Ripara"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Impostazioni istanza"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Avvio..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Arresto..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Aggiungi e avvia"
|
"message": "Aggiungi e avvia"
|
||||||
},
|
},
|
||||||
@@ -725,6 +1142,15 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Salva come..."
|
"message": "Salva come..."
|
||||||
},
|
},
|
||||||
|
"instance.locked.delete-button": {
|
||||||
|
"message": "Elimina istanza"
|
||||||
|
},
|
||||||
|
"instance.locked.play-tooltip": {
|
||||||
|
"message": "Questa istanza è stata bloccata"
|
||||||
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Mai avviata"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Indirizzo"
|
"message": "Indirizzo"
|
||||||
},
|
},
|
||||||
@@ -750,7 +1176,7 @@
|
|||||||
"message": "Elimina permanentemente un'istanza dal tuo dispositivo, compresi i tuoi mondi, file di configurazione e tutto il contenuto installato. Fai attenzione: eliminata un'istanza non c'è modo di recuperarla."
|
"message": "Elimina permanentemente un'istanza dal tuo dispositivo, compresi i tuoi mondi, file di configurazione e tutto il contenuto installato. Fai attenzione: eliminata un'istanza non c'è modo di recuperarla."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.deleting.button": {
|
"instance.settings.tabs.general.deleting.button": {
|
||||||
"message": "Eliminando..."
|
"message": "Eliminazione..."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.duplicate-button": {
|
"instance.settings.tabs.general.duplicate-button": {
|
||||||
"message": "Duplica"
|
"message": "Duplica"
|
||||||
@@ -771,7 +1197,7 @@
|
|||||||
"message": "Rimuovi icona"
|
"message": "Rimuovi icona"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.edit-icon.replace": {
|
"instance.settings.tabs.general.edit-icon.replace": {
|
||||||
"message": "Cambia icona"
|
"message": "Sfoglia"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.edit-icon.select": {
|
"instance.settings.tabs.general.edit-icon.select": {
|
||||||
"message": "Scegli un'icona"
|
"message": "Scegli un'icona"
|
||||||
@@ -860,6 +1286,9 @@
|
|||||||
"instance.settings.tabs.installation.loader-version": {
|
"instance.settings.tabs.installation.loader-version": {
|
||||||
"message": "Versione di {loader}"
|
"message": "Versione di {loader}"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.installation.locked": {
|
||||||
|
"message": "Le impostazioni non sono disponibili mentre l'istanza è bloccata."
|
||||||
|
},
|
||||||
"instance.settings.tabs.java": {
|
"instance.settings.tabs.java": {
|
||||||
"message": "Java e memoria"
|
"message": "Java e memoria"
|
||||||
},
|
},
|
||||||
@@ -899,6 +1328,9 @@
|
|||||||
"instance.settings.tabs.java.java-path-placeholder": {
|
"instance.settings.tabs.java.java-path-placeholder": {
|
||||||
"message": "/percorso/di/java"
|
"message": "/percorso/di/java"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.sharing": {
|
||||||
|
"message": "Condivisione"
|
||||||
|
},
|
||||||
"instance.settings.tabs.window": {
|
"instance.settings.tabs.window": {
|
||||||
"message": "Finestra"
|
"message": "Finestra"
|
||||||
},
|
},
|
||||||
@@ -929,6 +1361,57 @@
|
|||||||
"instance.settings.tabs.window.width.enter": {
|
"instance.settings.tabs.window.width.enter": {
|
||||||
"message": "Inserisci larghezza..."
|
"message": "Inserisci larghezza..."
|
||||||
},
|
},
|
||||||
|
"instance.shared-instance.error.title": {
|
||||||
|
"message": "Qualcosa è andato storto"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.owner-tooltip": {
|
||||||
|
"message": "I contenuti dell'istanza stanno venendo condivisi agli utenti."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.added-label": {
|
||||||
|
"message": "Aggiunto"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.admonition-header": {
|
||||||
|
"message": "Invia l'aggiornamento ai giocatori"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.config-title-v2": {
|
||||||
|
"message": "Seleziona i file di configurazione"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.description": {
|
||||||
|
"message": "Revisiona i contenuti modificati e scegli i file di configurazione da includere nell'aggiornamento."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.header": {
|
||||||
|
"message": "Revisiona modifiche"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.publish-button": {
|
||||||
|
"message": "Invia"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.removed-label": {
|
||||||
|
"message": "Rimosso"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.tooltip": {
|
||||||
|
"message": "I contenuti dell'istanza stanno venendo gestiti da qualcun altro."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.access-revoked-text": {
|
||||||
|
"message": "L'accesso all'istanza condivisa è stato revocato. È ancora disponibile localmente, ma non è più collegata e non riceverà aggiornamenti."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.deleted-text": {
|
||||||
|
"message": "L'istanza primaria è stata eliminata. È ancora disponibile localmente, ma non è più collegata e non riceverà aggiornamenti."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-text": {
|
||||||
|
"message": "L'istanza condivisa è stata bloccata dal team di moderazione dei contenuti. Non riceverà più aggiornamenti dall'istanza primara e non potrà essere avviata."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.locked-title": {
|
||||||
|
"message": "Istanza bloccata"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.manager-fallback": {
|
||||||
|
"message": "il gestore dell'istanza"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.text": {
|
||||||
|
"message": "L'istanza locale è ancora disponibile, ma non è più collegata e non riceverà aggiornamenti."
|
||||||
|
},
|
||||||
|
"instance.shared-instance.unavailable.title": {
|
||||||
|
"message": "Istanza condivisa non più disponibile"
|
||||||
|
},
|
||||||
"instance.worlds.a_minecraft_server": {
|
"instance.worlds.a_minecraft_server": {
|
||||||
"message": "Un server Minecraft"
|
"message": "Un server Minecraft"
|
||||||
},
|
},
|
||||||
@@ -992,6 +1475,63 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Accedi a Minecraft"
|
"message": "Accedi a Minecraft"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Devi disporre di una copia di Minecraft da un account Microsoft prima di poter giocare."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Accedi a un account Microsoft"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Non hai un account?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Ottieni Minecraft"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Assistenza"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft richiesto"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Accedi a Microsoft"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.browser-description": {
|
||||||
|
"message": "Si è aperta una nuova scheda per effettuare l'accesso. Poi torna all'app."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.cancel-button": {
|
||||||
|
"message": "Annulla"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.continue-in-browser-heading": {
|
||||||
|
"message": "Continua nel browser"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.create-account-button": {
|
||||||
|
"message": "Crea un account"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.description": {
|
||||||
|
"message": "Devi aver effettuato l'accesso a Modrinth per usare questa funzione."
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.header": {
|
||||||
|
"message": "Account richiesto"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.open-browser-again-button": {
|
||||||
|
"message": "Apri di nuovo il browser"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-button": {
|
||||||
|
"message": "Accedi a Modrinth"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.sign-in-heading": {
|
||||||
|
"message": "Accedi a un account Modrinth"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.signing-in-header": {
|
||||||
|
"message": "Accesso"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.support-prompt": {
|
||||||
|
"message": "Hai problemi ad accedere? Scrivi al <support>supporto</support>"
|
||||||
|
},
|
||||||
|
"modal.modrinth-account-required.waiting-for-browser": {
|
||||||
|
"message": "Aspettando la conferma del browser..."
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Determinato dall'istanza"
|
"message": "Determinato dall'istanza"
|
||||||
},
|
},
|
||||||
@@ -1015,26 +1555,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Il loader è determinato dal server"
|
"message": "Il loader è determinato dal server"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Solo i file caricati su Modrinth vengono esaminati, qualunque sia il loro formato (.mrpack inclusi)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Non mostrare più questo avviso"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Conferma l'installazione"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Installa comunque"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Spesso i malware vengono nascosti nei pacchetti di mod, poi distribuiti su piattaforme come Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Non è stato possibile trovare questo file su Modrinth. Consigliamo di installare file solo da fonti attendibili."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Tipo di file sconosciuto"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,87 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "実行中のインスタンスの一部を非表示"
|
"message": "実行中のインスタンスの一部を非表示"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "コピーしました"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "詳細をコピー"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "閉じる"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "インスタンスを表示"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "再試行"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "アプリの終了によりキャンセルされました"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "ModPackを読み込むことができませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "キャンセルしました"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "クリーンアップが完了しませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "ファイルをダウンロードできませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "ダウンロードしたファイルが破損しています"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "ファイルを保存できませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "ダウンロードを完了することができませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "インスタンスが見つかりませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "ファイルパスが無効です"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Modパックのデータが無効です"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Modパックのファイルのメタデータに不正な部分があります"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "Javaのセットアップに失敗しました"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "ローダーのセットアップに失敗しました"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "ローカルデータを更新できませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "マインクラフトのセットアップに失敗しました"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Modrinthに接続できませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "書き込み権限がありません"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "パックをダウンロードできませんでした"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "問題が発生しました"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "不明なインスタンス"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "インストール数"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "デフォルトのインスタンスを作成"
|
"message": "デフォルトのインスタンスを作成"
|
||||||
},
|
},
|
||||||
@@ -23,12 +104,18 @@
|
|||||||
"app.action-bar.primary-instance": {
|
"app.action-bar.primary-instance": {
|
||||||
"message": "デフォルトのインスタンス"
|
"message": "デフォルトのインスタンス"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.reload-to-update": {
|
||||||
|
"message": "再読み込みしてアップデート"
|
||||||
|
},
|
||||||
"app.action-bar.show-more-running-instances": {
|
"app.action-bar.show-more-running-instances": {
|
||||||
"message": "実行中のインスタンスをさらに表示"
|
"message": "実行中のインスタンスをさらに表示"
|
||||||
},
|
},
|
||||||
"app.action-bar.stop-instance": {
|
"app.action-bar.stop-instance": {
|
||||||
"message": "インスタンスを停止"
|
"message": "インスタンスを停止"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.update": {
|
||||||
|
"message": "アップデート"
|
||||||
|
},
|
||||||
"app.action-bar.view-active-downloads": {
|
"app.action-bar.view-active-downloads": {
|
||||||
"message": "進行中のダウンロードを表示"
|
"message": "進行中のダウンロードを表示"
|
||||||
},
|
},
|
||||||
@@ -38,6 +125,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "ログを表示"
|
"message": "ログを表示"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "すべて受け入れる"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Modrinthは広告収益によって運営され、クリエイターへの報酬も広告収益から支払われています。当社のパートナーは、広告のパーソナライズや効果測定のために、アプリ内でCookieを保存・利用する場合があります。"
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "設定の管理"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "すべて拒否する"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "プライバシーと広告がModrinthを支える仕組み"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "ぼかし効果などの高度なレンダリングを有効にします。グラフィックアクセラレーションが使用できない場合は、パフォーマンスが低下する可能性があります。"
|
"message": "ぼかし効果などの高度なレンダリングを有効にします。グラフィックアクセラレーションが使用できない場合は、パフォーマンスが低下する可能性があります。"
|
||||||
},
|
},
|
||||||
@@ -51,7 +153,7 @@
|
|||||||
"message": "テーマ"
|
"message": "テーマ"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.default-landing-page.description": {
|
"app.appearance-settings.default-landing-page.description": {
|
||||||
"message": "ランチャー起動時に表示するページを変更します"
|
"message": "ランチャー起動時に表示するページを変更します。"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.default-landing-page.home": {
|
"app.appearance-settings.default-landing-page.home": {
|
||||||
"message": "ホーム"
|
"message": "ホーム"
|
||||||
@@ -81,7 +183,7 @@
|
|||||||
"message": "ランチャーを最小化"
|
"message": "ランチャーを最小化"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.native-decorations.description": {
|
"app.appearance-settings.native-decorations.description": {
|
||||||
"message": "OSデフォルトのウィンドウUIを使用します。(アプリの再起動が必要です)"
|
"message": "OsのウィンドウUIを使用します(アプリの再起動が必要です)。"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.native-decorations.title": {
|
"app.appearance-settings.native-decorations.title": {
|
||||||
"message": "OSのウィンドウUIを使用"
|
"message": "OSのウィンドウUIを使用"
|
||||||
@@ -95,6 +197,12 @@
|
|||||||
"app.appearance-settings.show-play-time.title": {
|
"app.appearance-settings.show-play-time.title": {
|
||||||
"message": "プレイ時間を表示"
|
"message": "プレイ時間を表示"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "Modパックの重複インストール、通常のコンテンツ削除、一括更新、Modパックのリンク解除、修復の促しなど、リスクの低い確認画面は自動的にスキップされます。危険な警告は引き続き表示されます。"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "重要でない警告をスキップ"
|
||||||
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "サイドバーの表示/非表示を切り替える機能を有効にします。"
|
"message": "サイドバーの表示/非表示を切り替える機能を有効にします。"
|
||||||
},
|
},
|
||||||
@@ -113,6 +221,12 @@
|
|||||||
"app.auth-servers.unreachable.header": {
|
"app.auth-servers.unreachable.header": {
|
||||||
"message": "認証サーバーにアクセスできません"
|
"message": "認証サーバーにアクセスできません"
|
||||||
},
|
},
|
||||||
|
"app.browse.add-servers-to-instance": {
|
||||||
|
"message": "インスタンスにサーバーを追加中"
|
||||||
|
},
|
||||||
|
"app.browse.add-to-an-instance": {
|
||||||
|
"message": "インスタンスに追加"
|
||||||
|
},
|
||||||
"app.browse.add-to-instance": {
|
"app.browse.add-to-instance": {
|
||||||
"message": "インスタンスに追加"
|
"message": "インスタンスに追加"
|
||||||
},
|
},
|
||||||
@@ -125,6 +239,9 @@
|
|||||||
"app.browse.already-added": {
|
"app.browse.already-added": {
|
||||||
"message": "すでに追加済み"
|
"message": "すでに追加済み"
|
||||||
},
|
},
|
||||||
|
"app.browse.back-to-instance": {
|
||||||
|
"message": "インスタンスに戻る"
|
||||||
|
},
|
||||||
"app.browse.discover-content": {
|
"app.browse.discover-content": {
|
||||||
"message": "コンテンツを探す"
|
"message": "コンテンツを探す"
|
||||||
},
|
},
|
||||||
@@ -137,9 +254,15 @@
|
|||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modパック"
|
"message": "Modパック"
|
||||||
},
|
},
|
||||||
|
"app.browse.server-instance-content-warning": {
|
||||||
|
"message": "コンテンツを追加すると、サーバーに参加する際に互換性が失われる可能性があります。また、追加されたコンテンツはインスタンスのコンテンツをアップデートした際に失われます。"
|
||||||
|
},
|
||||||
"app.browse.server.installing": {
|
"app.browse.server.installing": {
|
||||||
"message": "インストール中"
|
"message": "インストール中"
|
||||||
},
|
},
|
||||||
|
"app.content-install.no-compatible-versions": {
|
||||||
|
"message": "{compatibilityLabel} に一致する利用可能なバージョンがありません。このままインストールしますか?依存関係は自動的にインストールされません。"
|
||||||
|
},
|
||||||
"app.export-modal.description-placeholder": {
|
"app.export-modal.description-placeholder": {
|
||||||
"message": "Modパックの説明を入力…"
|
"message": "Modパックの説明を入力…"
|
||||||
},
|
},
|
||||||
@@ -161,6 +284,60 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.downloading_content": {
|
||||||
|
"message": "コンテンツをダウンロード中"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_minecraft": {
|
||||||
|
"message": "マインクラフトをダウンロード中"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_pack_file": {
|
||||||
|
"message": "パックファイルをダウンロード中"
|
||||||
|
},
|
||||||
|
"app.install.phase.extracting_overrides": {
|
||||||
|
"message": "追加ファイルを展開中"
|
||||||
|
},
|
||||||
|
"app.install.phase.finalizing": {
|
||||||
|
"message": "最終処理中"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_instance": {
|
||||||
|
"message": "インストール待ち"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java": {
|
||||||
|
"message": "Javaを準備中"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "Java {version} をダウンロードしています"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "Java {version} を展開中"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "Java {version} を取得中"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.resolving": {
|
||||||
|
"message": "Java {version} を準備中"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "Java {version} を検証中"
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "パックのマニフェストを読み込み中"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_loader": {
|
||||||
|
"message": "ローダーを解析中"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_minecraft": {
|
||||||
|
"message": "マインクラフトを解析中"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_pack": {
|
||||||
|
"message": "コンテンツを解析中"
|
||||||
|
},
|
||||||
|
"app.install.phase.rolling_back": {
|
||||||
|
"message": "変更を取り消し中"
|
||||||
|
},
|
||||||
|
"app.install.phase.running_loader_processors": {
|
||||||
|
"message": "ローダーのプロセッサーを実行中"
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "インスタンス内のすべてのデータは、ワールド、設定、インストール済みのコンテンツを含め、完全に削除されます。"
|
"message": "インスタンス内のすべてのデータは、ワールド、設定、インストール済みのコンテンツを含め、完全に削除されます。"
|
||||||
},
|
},
|
||||||
@@ -174,7 +351,7 @@
|
|||||||
"message": "インスタンスを削除"
|
"message": "インスタンスを削除"
|
||||||
},
|
},
|
||||||
"app.instance.modpack-already-installed.body": {
|
"app.instance.modpack-already-installed.body": {
|
||||||
"message": "このModpackは既に <bold>{instanceName}</bold> インスタンスにインストール済みです。本当に複製しますか?"
|
"message": "このModパックは既に <bold>{instanceName}</bold> インスタンスにインストール済みです。本当に複製しますか?"
|
||||||
},
|
},
|
||||||
"app.instance.modpack-already-installed.create": {
|
"app.instance.modpack-already-installed.create": {
|
||||||
"message": "新規作成"
|
"message": "新規作成"
|
||||||
@@ -185,6 +362,15 @@
|
|||||||
"app.instance.modpack-already-installed.instance": {
|
"app.instance.modpack-already-installed.instance": {
|
||||||
"message": "インスタンス"
|
"message": "インスタンス"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "プロジェクトをダウンロード中 {current, number}/{total, number}…"
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
|
"message": "アップデートを完了中…"
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.resolving-versions": {
|
||||||
|
"message": "バージョンを解析中…"
|
||||||
|
},
|
||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "プロジェクト"
|
"message": "プロジェクト"
|
||||||
},
|
},
|
||||||
@@ -209,6 +395,18 @@
|
|||||||
"app.instance.worlds.browse-servers": {
|
"app.instance.worlds.browse-servers": {
|
||||||
"message": "サーバーを探す"
|
"message": "サーバーを探す"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.delete-button": {
|
||||||
|
"message": "ワールドを削除"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.title": {
|
||||||
|
"message": "ワールドの削除"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
|
"message": "このワールドはインスタンスから完全に削除されます。この操作は取り消せません。"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
|
"message": "{name} を削除します"
|
||||||
|
},
|
||||||
"app.instance.worlds.filter-modded": {
|
"app.instance.worlds.filter-modded": {
|
||||||
"message": "Mod導入済み"
|
"message": "Mod導入済み"
|
||||||
},
|
},
|
||||||
@@ -227,32 +425,50 @@
|
|||||||
"app.instance.worlds.no-worlds-heading": {
|
"app.instance.worlds.no-worlds-heading": {
|
||||||
"message": "サーバー、ワールドは追加されていません"
|
"message": "サーバー、ワールドは追加されていません"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.remove-button": {
|
||||||
|
"message": "サーバーを削除"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.title": {
|
||||||
|
"message": "サーバーの削除"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-body": {
|
||||||
|
"message": "このサーバーはサーバーリストおよびゲーム内のサーバーリストから削除されます。アドレスが分かれば、後からいつでも再追加できます。"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-header": {
|
||||||
|
"message": "{name} を削除します"
|
||||||
|
},
|
||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "{count} 個のワールドを検索…"
|
"message": "{count} 個のワールドを検索…"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "必須コンテンツ"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "インストールしてプレイ"
|
"message": "インストールしてプレイ"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "このままインストール"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "インストール"
|
"message": "インストール"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "この招待は他のModrinthユーザーによって作成されたものであり、Modrinth公式のものではありません。信頼できる人からの招待のみ承諾してください。"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, other {#個のMod}}"
|
"message": "{count, plural, other {#個のMod}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "必須のModパック"
|
"message": "ファイル形式(.mrpackを含む)に関わらず、Modrinthに公開されているファイルのみが審査の対象となります。"
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "このサーバーをプレイするにはModが必要です。インストールをクリックしてModrinthから必要なファイルを設定し、サーバーに接続してください。"
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "共有インスタンス"
|
"message": "共有インスタンス"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "共有サーバーインスタンス"
|
"message": "このサーバーModパックには、Modrinthに公開されていないファイルが含まれています。信頼できるソースからのファイルのみをインストールすることを強く推奨します。"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "不明なファイルの警告"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "認識されないファイル"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "コンテンツを見る"
|
"message": "コンテンツを見る"
|
||||||
@@ -260,11 +476,29 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "更新してプレイ"
|
"message": "更新してプレイ"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "更新が必要です"
|
"message": "削除されました"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required-description": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "{name}をプレイするには更新が必要です。ゲームを起動するには最新版に更新してください。"
|
"message": "このプロジェクトは既にインストールされています"
|
||||||
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "バージョンを切り替える"
|
||||||
|
},
|
||||||
|
"app.project.install-context.back-to-browse": {
|
||||||
|
"message": "ディスカバーに戻る"
|
||||||
|
},
|
||||||
|
"app.project.version.all-versions": {
|
||||||
|
"message": "すべてのバージョン"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "ブラウザでダウンロード"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "インストール中"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "既にインストールされています"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "開発者モードがオンになっています。"
|
"message": "開発者モードがオンになっています。"
|
||||||
@@ -272,6 +506,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "v{version}をダウンロード中"
|
"message": "v{version}をダウンロード中"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Modrinthは広告収益によって運営され、クリエイターへの報酬も広告収益から支払われています。当社のパートナーは、広告のパーソナライズや効果測定のために、アプリ内でCookieを保存・利用する場合があります。この機能は下のボタンから個別に拒否や許可または変更することができます。"
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "表示設定"
|
"message": "表示設定"
|
||||||
},
|
},
|
||||||
@@ -290,6 +527,45 @@
|
|||||||
"app.settings.tabs.resource-management": {
|
"app.settings.tabs.resource-management": {
|
||||||
"message": "リソース管理"
|
"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.ears-feature-notice": {
|
||||||
|
"message": "このスキンに{ears} modの機能を使用する"
|
||||||
|
},
|
||||||
|
"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": {
|
"app.skins.modal.arm-style-slim": {
|
||||||
"message": "スリム"
|
"message": "スリム"
|
||||||
},
|
},
|
||||||
@@ -302,24 +578,63 @@
|
|||||||
"app.skins.modal.cape-section": {
|
"app.skins.modal.cape-section": {
|
||||||
"message": "マント"
|
"message": "マント"
|
||||||
},
|
},
|
||||||
|
"app.skins.modal.edit-title": {
|
||||||
|
"message": "スキンを編集中"
|
||||||
|
},
|
||||||
|
"app.skins.modal.make-edit-first-tooltip": {
|
||||||
|
"message": "まずスキンを編集してください!"
|
||||||
|
},
|
||||||
"app.skins.modal.no-cape-tooltip": {
|
"app.skins.modal.no-cape-tooltip": {
|
||||||
"message": "マントなし"
|
"message": "マントなし"
|
||||||
},
|
},
|
||||||
|
"app.skins.modal.none-cape-option": {
|
||||||
|
"message": "無し"
|
||||||
|
},
|
||||||
"app.skins.modal.replace-texture-button": {
|
"app.skins.modal.replace-texture-button": {
|
||||||
"message": "アップロード"
|
"message": "アップロード"
|
||||||
},
|
},
|
||||||
|
"app.skins.modal.save-skin-button": {
|
||||||
|
"message": "スキンを保存する"
|
||||||
|
},
|
||||||
|
"app.skins.modal.saving-tooltip": {
|
||||||
|
"message": "保存しています…"
|
||||||
|
},
|
||||||
"app.skins.modal.texture-section": {
|
"app.skins.modal.texture-section": {
|
||||||
"message": "テクスチャ"
|
"message": "テクスチャ"
|
||||||
},
|
},
|
||||||
|
"app.skins.modal.upload-skin-first-tooltip": {
|
||||||
|
"message": "まずスキンをアップロードしてください!"
|
||||||
|
},
|
||||||
"app.skins.preview.edit-button": {
|
"app.skins.preview.edit-button": {
|
||||||
"message": "編集"
|
"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": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "ビルダーズ&バイオーム"
|
"message": "ビルダーズ&バイオーム"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "チェイス・ザ・スカイ"
|
"message": "チェイス・ザ・スカイ"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.default-skins": {
|
||||||
|
"message": "デフォルトのスキンたち"
|
||||||
|
},
|
||||||
"app.skins.section.minecon-earth-2017": {
|
"app.skins.section.minecon-earth-2017": {
|
||||||
"message": "MINECON Earth 2017"
|
"message": "MINECON Earth 2017"
|
||||||
},
|
},
|
||||||
@@ -329,6 +644,9 @@
|
|||||||
"app.skins.section.modrinth-pride": {
|
"app.skins.section.modrinth-pride": {
|
||||||
"message": "Modrinth プライド"
|
"message": "Modrinth プライド"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.modrinth-pride.tooltip": {
|
||||||
|
"message": "これらのスキンは、プライド月間中にModrinthのプライド募金活動に寄付したことで獲得したものです。"
|
||||||
|
},
|
||||||
"app.skins.section.mounts-of-mayhem": {
|
"app.skins.section.mounts-of-mayhem": {
|
||||||
"message": "マウント・オブ・メイヘム"
|
"message": "マウント・オブ・メイヘム"
|
||||||
},
|
},
|
||||||
@@ -347,9 +665,27 @@
|
|||||||
"app.skins.section.tiny-takeover": {
|
"app.skins.section.tiny-takeover": {
|
||||||
"message": "タイニー・テイクオーバー"
|
"message": "タイニー・テイクオーバー"
|
||||||
},
|
},
|
||||||
|
"app.skins.sign-in.button": {
|
||||||
|
"message": "サイン審"
|
||||||
|
},
|
||||||
|
"app.skins.sign-in.description": {
|
||||||
|
"message": "Modrinthアプリのスキン管理機能を使用するには、マインクラフトアカウントにサインインしてください。"
|
||||||
|
},
|
||||||
"app.skins.sign-in.rinthbot-alt": {
|
"app.skins.sign-in.rinthbot-alt": {
|
||||||
"message": "ワクワクしている Modrinth ボット"
|
"message": "ワクワクしている Modrinth ボット"
|
||||||
},
|
},
|
||||||
|
"app.skins.sign-in.title": {
|
||||||
|
"message": "サインインしてください"
|
||||||
|
},
|
||||||
|
"app.skins.title": {
|
||||||
|
"message": "スキンセレクター"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "オフに切り替え"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "オンに切り替え"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App v{version} のダウンロードが完了しました。今すぐ更新するには再読み込みするか、Modrinth Appを閉じる際に自動更新されます。"
|
"message": "Modrinth App v{version} のダウンロードが完了しました。今すぐ更新するには再読み込みするか、Modrinth Appを閉じる際に自動更新されます。"
|
||||||
},
|
},
|
||||||
@@ -368,6 +704,9 @@
|
|||||||
"app.update-popup.download-complete": {
|
"app.update-popup.download-complete": {
|
||||||
"message": "ダウンロード完了"
|
"message": "ダウンロード完了"
|
||||||
},
|
},
|
||||||
|
"app.update-popup.reload": {
|
||||||
|
"message": "再度読み込みして更新"
|
||||||
|
},
|
||||||
"app.update-popup.title": {
|
"app.update-popup.title": {
|
||||||
"message": "アップデートが利用可能です"
|
"message": "アップデートが利用可能です"
|
||||||
},
|
},
|
||||||
@@ -458,6 +797,33 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Modrinthアカウントにサインイン</link>して友達を追加し、彼らがプレイしているゲームをチェックしよう!"
|
"message": "<link>Modrinthアカウントにサインイン</link>して友達を追加し、彼らがプレイしているゲームをチェックしよう!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "ショートカット作成"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Modパックとしてエクスポート"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "インスタンスを起動"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "その他"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "フォルダーを開く"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "修復"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "インスタンスの設定"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "起動中…"
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "停止中…"
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "追加してプレイ"
|
"message": "追加してプレイ"
|
||||||
},
|
},
|
||||||
@@ -500,6 +866,9 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "名前をつけて保存…"
|
"message": "名前をつけて保存…"
|
||||||
},
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "未プレイ"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "アドレス"
|
"message": "アドレス"
|
||||||
},
|
},
|
||||||
@@ -566,6 +935,30 @@
|
|||||||
"instance.settings.tabs.general.name": {
|
"instance.settings.tabs.general.name": {
|
||||||
"message": "名前"
|
"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": {
|
"instance.settings.tabs.hooks": {
|
||||||
"message": "起動フック"
|
"message": "起動フック"
|
||||||
},
|
},
|
||||||
@@ -614,6 +1007,24 @@
|
|||||||
"instance.settings.tabs.java": {
|
"instance.settings.tabs.java": {
|
||||||
"message": "Javaとメモリ"
|
"message": "Javaとメモリ"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.java.custom-environment-variables": {
|
||||||
|
"message": "カスタム環境変数"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.custom-java-arguments": {
|
||||||
|
"message": "カスタムJava引数"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.custom-java-installation": {
|
||||||
|
"message": "カスタムJavaインストール"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||||
|
"message": "カスタムメモリ割り当て"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.enter-environment-variables": {
|
||||||
|
"message": "環境変数を入力…"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.java.enter-java-arguments": {
|
||||||
|
"message": "Java引数を入力…"
|
||||||
|
},
|
||||||
"instance.settings.tabs.java.environment-variables": {
|
"instance.settings.tabs.java.environment-variables": {
|
||||||
"message": "環境変数"
|
"message": "環境変数"
|
||||||
},
|
},
|
||||||
@@ -671,6 +1082,9 @@
|
|||||||
"instance.worlds.copy_address": {
|
"instance.worlds.copy_address": {
|
||||||
"message": "アドレスをコピー"
|
"message": "アドレスをコピー"
|
||||||
},
|
},
|
||||||
|
"instance.worlds.create_shortcut": {
|
||||||
|
"message": "ショートカット作成"
|
||||||
|
},
|
||||||
"instance.worlds.dont_show_on_home": {
|
"instance.worlds.dont_show_on_home": {
|
||||||
"message": "ホームに表示しない"
|
"message": "ホームに表示しない"
|
||||||
},
|
},
|
||||||
@@ -722,6 +1136,27 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Minecraftにサインイン"
|
"message": "Minecraftにサインイン"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Minecraft を起動してプレイするには、Minecraft を所有している Microsoft アカウントが必要です。"
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Microsoft アカウントにサインインしてください"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "まだアカウントを持っていませんか?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Minecraft を入手する"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "サポートを受ける"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft が必要です"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Microsoft にサインイン"
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "インスタンスによる条件"
|
"message": "インスタンスによる条件"
|
||||||
},
|
},
|
||||||
@@ -745,26 +1180,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "ローダーはサーバーによる条件です"
|
"message": "ローダーはサーバーによる条件です"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "ファイル形式に関わらず、Modrinthにアップロードされたファイルのみが確認されます。(.mrpackを含む)"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "この警告を次回から表示しない"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "インストールの確認"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "インストールを続行"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "一般的にマルウェアは、Discord等のプラットフォーム上でModパックファイルを配布して拡散されます"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "このファイルをModrinth上で見つけることができませんでした。信頼できるソースからインストールすることを強くお勧めします。"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "不明なファイルの警告"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"message": "Java {version} 다운로드 중"
|
"message": "Java {version} 다운로드 중"
|
||||||
},
|
},
|
||||||
"app.action-bar.downloading-update": {
|
"app.action-bar.downloading-update": {
|
||||||
"message": "업데이트 다운로드중"
|
"message": "업데이트 다운로드 중"
|
||||||
},
|
},
|
||||||
"app.action-bar.downloads": {
|
"app.action-bar.downloads": {
|
||||||
"message": "다운로드"
|
"message": "다운로드"
|
||||||
@@ -11,6 +11,87 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "실행 중인 인스턴스 숨기기"
|
"message": "실행 중인 인스턴스 숨기기"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "복사됨"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "세부 정보 복사"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "무시"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "인스턴스 열기"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "재시도"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "앱이 종료되어 취소되었습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "모드팩을 읽을 수 없음"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "취소됨"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "파일 정리가 완료되지 않았습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "파일을 다운로드할 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "다운로드한 파일이 손상되었습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "파일을 저장할 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "다운로드를 완료할 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "인스턴스를 찾을 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "파일 경로가 올바르지 않습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "모드팩 데이터가 올바르지 않습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "모드팩 파일이 올바르지 않은 메타데이터를 가지고 있습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "Java 설치를 완료할 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "로더 설치에 실패했습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "로컬 데이터를 업데이트할 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "Minecraft 설치에 실패했습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Modrinth에 연결할 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "쓰기 권한이 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "팩을 다운로드할 수 없습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "무언가 잘못되었습니다"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "알 수 없는 인스턴스"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "설치"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "기본 인스턴스로 지정"
|
"message": "기본 인스턴스로 지정"
|
||||||
},
|
},
|
||||||
@@ -23,12 +104,18 @@
|
|||||||
"app.action-bar.primary-instance": {
|
"app.action-bar.primary-instance": {
|
||||||
"message": "기본 인스턴스"
|
"message": "기본 인스턴스"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.reload-to-update": {
|
||||||
|
"message": "업데이트하려면 다시 로드"
|
||||||
|
},
|
||||||
"app.action-bar.show-more-running-instances": {
|
"app.action-bar.show-more-running-instances": {
|
||||||
"message": "실행 중인 인스턴스 보이기"
|
"message": "실행 중인 인스턴스 보이기"
|
||||||
},
|
},
|
||||||
"app.action-bar.stop-instance": {
|
"app.action-bar.stop-instance": {
|
||||||
"message": "인스턴스 멈추기"
|
"message": "인스턴스 멈추기"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.update": {
|
||||||
|
"message": "업데이트"
|
||||||
|
},
|
||||||
"app.action-bar.view-active-downloads": {
|
"app.action-bar.view-active-downloads": {
|
||||||
"message": "다운로드 목록 보기"
|
"message": "다운로드 목록 보기"
|
||||||
},
|
},
|
||||||
@@ -38,6 +125,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "로그 보기"
|
"message": "로그 보기"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "모두 수락"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "광고는 Modrinth가 운영될 수 있도록 하며, 크리에이터에게 지급되는 보상을 지원합니다. 우리의 파트너는 앱에서 광고를 개인화하고 성과를 측정하기 위해 쿠키를 저장하거나 접근할 수 있습니다."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "환경 설정 관리"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "모두 거절"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "개인정보와 광고가 Modrinth를 지원하는 방식"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "블러 효과와 같은 고급 렌더링 기능을 활성화합니다. 하드웨어 가속 없이는 성능 저하가 발생할 수 있습니다."
|
"message": "블러 효과와 같은 고급 렌더링 기능을 활성화합니다. 하드웨어 가속 없이는 성능 저하가 발생할 수 있습니다."
|
||||||
},
|
},
|
||||||
@@ -95,6 +197,12 @@
|
|||||||
"app.appearance-settings.show-play-time.title": {
|
"app.appearance-settings.show-play-time.title": {
|
||||||
"message": "플레이 시간 표시"
|
"message": "플레이 시간 표시"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "중복되는 모드팩 설치와 일반적인 콘텐츠 삭제, 동시 업데이트, 모드팩 링크 제거, 프롬프트 복구처럼 리스크가 적은 행위에 대한 확인 절차를 자동으로 넘깁니다. 위험한 경고는 여전히 표시됩니다."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "중요하지 않은 경고 넘기기"
|
||||||
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "사이드바를 접거나 펼칠 수 있는 기능을 활성화합니다."
|
"message": "사이드바를 접거나 펼칠 수 있는 기능을 활성화합니다."
|
||||||
},
|
},
|
||||||
@@ -141,7 +249,7 @@
|
|||||||
"message": "서버 탐색하기"
|
"message": "서버 탐색하기"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "이미 추가된 서버 숨기기"
|
"message": "이미 추가한 서버 숨기기"
|
||||||
},
|
},
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "모드팩"
|
"message": "모드팩"
|
||||||
@@ -176,6 +284,60 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.downloading_content": {
|
||||||
|
"message": "콘텐츠 다운로드 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_minecraft": {
|
||||||
|
"message": "Minecraft 다운로드 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_pack_file": {
|
||||||
|
"message": "팩 파일 다운로드 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.extracting_overrides": {
|
||||||
|
"message": "재정의 콘텐츠 추출 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.finalizing": {
|
||||||
|
"message": "마무리 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_instance": {
|
||||||
|
"message": "설치 대기열에 추가됨"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java": {
|
||||||
|
"message": "Java 준비 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "Java {version} 다운로드 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "Java {version} 추출 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "Java {version} 가져오는 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.resolving": {
|
||||||
|
"message": "Java {version} 준비 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "Java {version} 유효성 검사 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "팩 manifest 읽는 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_loader": {
|
||||||
|
"message": "로더 해결 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_minecraft": {
|
||||||
|
"message": "Minecraft 해결 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_pack": {
|
||||||
|
"message": "콘텐츠 해결 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.rolling_back": {
|
||||||
|
"message": "뒤로 돌리는 중"
|
||||||
|
},
|
||||||
|
"app.install.phase.running_loader_processors": {
|
||||||
|
"message": "로더 진행기 실행 중"
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "인스턴스의 모든 데이터가 삭제됩니다. 세계 폴더, 설정 폴더 등 설치된 모든 컨텐츠가 포함됩니다."
|
"message": "인스턴스의 모든 데이터가 삭제됩니다. 세계 폴더, 설정 폴더 등 설치된 모든 컨텐츠가 포함됩니다."
|
||||||
},
|
},
|
||||||
@@ -200,6 +362,15 @@
|
|||||||
"app.instance.modpack-already-installed.instance": {
|
"app.instance.modpack-already-installed.instance": {
|
||||||
"message": "인스턴스"
|
"message": "인스턴스"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "{current, number}/{total, number} 프로젝트 다운로드 중..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
|
"message": "업데이트 마무리 중..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.resolving-versions": {
|
||||||
|
"message": "버전 해결 중..."
|
||||||
|
},
|
||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "프로젝트"
|
"message": "프로젝트"
|
||||||
},
|
},
|
||||||
@@ -224,6 +395,18 @@
|
|||||||
"app.instance.worlds.browse-servers": {
|
"app.instance.worlds.browse-servers": {
|
||||||
"message": "서버 탐색하기"
|
"message": "서버 탐색하기"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.delete-button": {
|
||||||
|
"message": "세계 삭제"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.title": {
|
||||||
|
"message": "세계 삭제"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
|
"message": "이 세계는 이 인스턴스로부터 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
|
"message": "{name} 삭제 중"
|
||||||
|
},
|
||||||
"app.instance.worlds.filter-modded": {
|
"app.instance.worlds.filter-modded": {
|
||||||
"message": "수정됨"
|
"message": "수정됨"
|
||||||
},
|
},
|
||||||
@@ -242,32 +425,50 @@
|
|||||||
"app.instance.worlds.no-worlds-heading": {
|
"app.instance.worlds.no-worlds-heading": {
|
||||||
"message": "추가된 서버 또는 세계 없음"
|
"message": "추가된 서버 또는 세계 없음"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.remove-button": {
|
||||||
|
"message": "서버 제거"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.title": {
|
||||||
|
"message": "서버 제거"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-body": {
|
||||||
|
"message": "이 서버는 서버 목록과 게임 내 서버 목록으로부터 삭제됩니다. 주소를 안다면 추후 다시 추가할 수 있습니다."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-header": {
|
||||||
|
"message": "{name} 제거 중"
|
||||||
|
},
|
||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "{count}개의 세계 검색..."
|
"message": "{count}개의 세계 검색..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "콘텐츠 설치 필요"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "설치하고 플레이"
|
"message": "설치하고 플레이"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "무시하고 설치"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "설치"
|
"message": "설치"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "이 초대장은 다른 Modrinth 사용자가 생성했으며, Modrinth에서 생성하지 않았습니다. 신뢰할 수 있는 초대장만 수락하십시오."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {모드 #개} other {모드 #개}}"
|
"message": "{count, plural, one {모드 #개} other {모드 #개}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "필요한 모드팩"
|
"message": "모든 파일은 형식(.mrpack 포함)에 무관하게 Modrinth에 게시되어야만 검수를 거칩니다."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "이 서버를 플레이하려면 모드가 필요합니다. '설치'를 클릭하여 Modrinth에서 필수 파일을 내려받은 후, 서버에 바로 접속하세요."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "인스턴스 공유됨"
|
"message": "인스턴스 공유됨"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "서버 인스턴스 공유됨"
|
"message": "이 서버의 모드팩은 Modrinth에 게시되지 않은 파일을 포함하고 있습니다. 신뢰할 수 있는 출처의 파일만 설치하는 것을 강력히 권장합니다."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "출처를 알 수 없는 파일"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "확인되지 않은 파일"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "구성 요소 보기"
|
"message": "구성 요소 보기"
|
||||||
@@ -275,20 +476,29 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "업데이트하고 플레이"
|
"message": "업데이트하고 플레이"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "업데이트 필요"
|
"message": "제거됨"
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "{name}을(를) 플레이하려면 업데이트가 필요합니다. 게임을 실행하려면 최신 버전으로 업데이트해 주세요."
|
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "이미 설치되어 있음"
|
"message": "이미 설치되어 있음"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "버전 변경"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "탐색으로 돌아가기"
|
"message": "탐색으로 돌아가기"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "인스턴스에 콘텐츠 설치"
|
"message": "모든 버전"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "브라우저에서 다운로드"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "설치 중"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "이미 설치됨"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "개발자 모드가 활성화되었습니다."
|
"message": "개발자 모드가 활성화되었습니다."
|
||||||
@@ -296,6 +506,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "v{version} 다운로드 중"
|
"message": "v{version} 다운로드 중"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "광고는 Modrinth가 운영될 수 있도록 하며, 크리에이터에게 지급되는 보상을 지원합니다. 우리의 파트너는 앱에서 광고를 개인화하고 성과를 측정하기 위해 쿠키를 저장하거나 접근할 수 있습니다. 아래에서 거부하거나 환경 설정을 관리할 수 있습니다."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "모양"
|
"message": "모양"
|
||||||
},
|
},
|
||||||
@@ -338,6 +551,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "파일 처리 중 오류가 발생했습니다."
|
"message": "파일 처리 중 오류가 발생했습니다."
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "이 스킨은 {ears} 모드의 기능을 사용합니다"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "스킨 편집"
|
"message": "스킨 편집"
|
||||||
},
|
},
|
||||||
@@ -401,9 +617,18 @@
|
|||||||
"app.skins.rate-limit.title": {
|
"app.skins.rate-limit.title": {
|
||||||
"message": "잠시 기다려주세요."
|
"message": "잠시 기다려주세요."
|
||||||
},
|
},
|
||||||
|
"app.skins.reorder-error.text": {
|
||||||
|
"message": "이 스킨 정렬은 저장되지 않습니다."
|
||||||
|
},
|
||||||
|
"app.skins.reorder-error.title": {
|
||||||
|
"message": "스킨 재정렬 실패"
|
||||||
|
},
|
||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "카오스 큐브"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -455,6 +680,12 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "스킨 선택"
|
"message": "스킨 선택"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "끄기"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "켜기"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Modrinth App v{version} 다운로드가 완료되었습니다. 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
|
"message": "Modrinth App v{version} 다운로드가 완료되었습니다. 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
|
||||||
},
|
},
|
||||||
@@ -473,6 +704,9 @@
|
|||||||
"app.update-popup.download-complete": {
|
"app.update-popup.download-complete": {
|
||||||
"message": "다운로드 완료"
|
"message": "다운로드 완료"
|
||||||
},
|
},
|
||||||
|
"app.update-popup.reload": {
|
||||||
|
"message": "새로고침하여 업데이트"
|
||||||
|
},
|
||||||
"app.update-popup.title": {
|
"app.update-popup.title": {
|
||||||
"message": "업데이트 가능"
|
"message": "업데이트 가능"
|
||||||
},
|
},
|
||||||
@@ -563,6 +797,33 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Modrinth 계정으로 로그인</link>하여 친구를 추가하고 무엇을 플레이 중인지 확인하세요!"
|
"message": "<link>Modrinth 계정으로 로그인</link>하여 친구를 추가하고 무엇을 플레이 중인지 확인하세요!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "바로가기 만들기"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "모드팩 내보내기"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "인스턴스 실행"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "더보기"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "폴더 열기"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "복구하기"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "인스턴스 설정"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "시작중..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "정지중..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "추가 후 플레이"
|
"message": "추가 후 플레이"
|
||||||
},
|
},
|
||||||
@@ -605,6 +866,9 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "다른 이름으로 저장..."
|
"message": "다른 이름으로 저장..."
|
||||||
},
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "아직 플레이 하지 않음"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "주소"
|
"message": "주소"
|
||||||
},
|
},
|
||||||
@@ -671,6 +935,30 @@
|
|||||||
"instance.settings.tabs.general.name": {
|
"instance.settings.tabs.general.name": {
|
||||||
"message": "이름"
|
"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": {
|
"instance.settings.tabs.hooks": {
|
||||||
"message": "실행 후크"
|
"message": "실행 후크"
|
||||||
},
|
},
|
||||||
@@ -794,6 +1082,9 @@
|
|||||||
"instance.worlds.copy_address": {
|
"instance.worlds.copy_address": {
|
||||||
"message": "주소 복사"
|
"message": "주소 복사"
|
||||||
},
|
},
|
||||||
|
"instance.worlds.create_shortcut": {
|
||||||
|
"message": "바로가기 만들기"
|
||||||
|
},
|
||||||
"instance.worlds.dont_show_on_home": {
|
"instance.worlds.dont_show_on_home": {
|
||||||
"message": "홈에서 숨기기"
|
"message": "홈에서 숨기기"
|
||||||
},
|
},
|
||||||
@@ -845,6 +1136,27 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "마인크래프트 계정으로 로그인"
|
"message": "마인크래프트 계정으로 로그인"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "게임을 실행하고 플레이하려면 마인크래프트를 보유한 Microsoft 계정이 필요합니다."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Microsoft 계정 로그인"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "계정이 없으신가요?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "마인크래프트 얻기"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "지원 받기"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "마인크래프트 필요"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Microsoft 계정 로그인"
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "인스턴스에서 관리"
|
"message": "인스턴스에서 관리"
|
||||||
},
|
},
|
||||||
@@ -868,26 +1180,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "로더가 서버에 의해 제공됩니다"
|
"message": "로더가 서버에 의해 제공됩니다"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "모든 파일은 형식(.mrpack 포함)에 무관하게 Modrinth에 업로드되어야만 검수를 거칩니다."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "이 경고를 다시 표시하지 않음"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "설치 확인"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "무시하고 설치"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "악성코드는 흔히 디스코드와 같은 플랫폼을 통해 모드팩 파일을 공유하는 방식으로 유포됩니다."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "이 파일을 Modrinth에서 찾을 수 없습니다. 신뢰할 수 있는 출처의 파일만 설치하는 것을 권장합니다."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "출처를 알 수 없는 파일 경고"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,12 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Sembunyikan lebih banyak pemasangan yang berjalan"
|
"message": "Sembunyikan lebih banyak pemasangan yang berjalan"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "Ketepikan"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "Cuba semula"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Jadikan pemasangan utama"
|
"message": "Jadikan pemasangan utama"
|
||||||
},
|
},
|
||||||
@@ -26,6 +32,9 @@
|
|||||||
"app.action-bar.stop-instance": {
|
"app.action-bar.stop-instance": {
|
||||||
"message": "Hentikan pemasangan"
|
"message": "Hentikan pemasangan"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.update": {
|
||||||
|
"message": "Kemas kini"
|
||||||
|
},
|
||||||
"app.action-bar.view-active-downloads": {
|
"app.action-bar.view-active-downloads": {
|
||||||
"message": "Lihat muat turun aktif"
|
"message": "Lihat muat turun aktif"
|
||||||
},
|
},
|
||||||
@@ -86,6 +95,9 @@
|
|||||||
"app.appearance-settings.select-option": {
|
"app.appearance-settings.select-option": {
|
||||||
"message": "Pilih satu pilihan"
|
"message": "Pilih satu pilihan"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "Melangkau pengesahan berisiko rendah secara automatik seperti pemasangan pek mod pendua, pemadaman kandungan biasa, kemas kini pukal, menyahpautkan pek mod dan gesaan pembaikan. Amaran berbahaya masih akan ditunjukkan."
|
||||||
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "Membolehkan keupayaan untuk menogol bar sisi."
|
"message": "Membolehkan keupayaan untuk menogol bar sisi."
|
||||||
},
|
},
|
||||||
@@ -131,9 +143,6 @@
|
|||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Temui pelayan"
|
"message": "Temui pelayan"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
|
||||||
"message": "Sembunyikan pelayan yang sudah ditambah"
|
|
||||||
},
|
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Pek Mod"
|
"message": "Pek Mod"
|
||||||
},
|
},
|
||||||
@@ -155,9 +164,6 @@
|
|||||||
"app.export-modal.header": {
|
"app.export-modal.header": {
|
||||||
"message": "Eksport pek mod"
|
"message": "Eksport pek mod"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
|
||||||
"message": "Nama Pek Mod"
|
|
||||||
},
|
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Nama pek mod"
|
"message": "Nama pek mod"
|
||||||
},
|
},
|
||||||
@@ -167,6 +173,24 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "Sedang memuat turun Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "Sedang mengekstrak Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "Sedang mengambil Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.resolving": {
|
||||||
|
"message": "Sedang menyediakan Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "Sedang mengesahkan Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "Sedang membaca manifest pek"
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Semua data untuk pemasangan anda akan dipadamkan secara kekal, termasuk dunia, konfigurasi dan semua kandungan yang dipasang."
|
"message": "Semua data untuk pemasangan anda akan dipadamkan secara kekal, termasuk dunia, konfigurasi dan semua kandungan yang dipasang."
|
||||||
},
|
},
|
||||||
@@ -236,9 +260,6 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Cari {count} dunia..."
|
"message": "Cari {count} dunia..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Kandungan yang diperlukan"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Pasang untuk mainkan"
|
"message": "Pasang untuk mainkan"
|
||||||
},
|
},
|
||||||
@@ -248,39 +269,21 @@
|
|||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, other {# mod}}"
|
"message": "{count, plural, other {# mod}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
|
||||||
"message": "Pek mod yang diperlukan"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Pelayan ini memerlukan mod untuk dimainkan. Klik Pasang untuk menyediakan fail yang diperlukan daripada Modrinth, kemudian lancarkan permainan terus ke dalam pelayan."
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Pemasangan yang dikongsi"
|
"message": "Pemasangan yang dikongsi"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Pemasangan pelayan yang dikongsi"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Lihat kandungan"
|
"message": "Lihat kandungan"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Kemas kini untuk mainkan"
|
"message": "Kemas kini untuk mainkan"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "Kemas kini diperlukan"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Kemas kini diperlukan untuk memainkan {name}. Sila kemas kini kepada versi terkini untuk melancarkan permainan."
|
|
||||||
},
|
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Projek ini sudah dipasang"
|
"message": "Projek ini sudah dipasang"
|
||||||
},
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Kembali menemukan"
|
"message": "Kembali menemukan"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
|
||||||
"message": "Pasang kandungan ke dalam pemasangan"
|
|
||||||
},
|
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Mod pembangun didayakan."
|
"message": "Mod pembangun didayakan."
|
||||||
},
|
},
|
||||||
@@ -626,6 +629,15 @@
|
|||||||
"instance.settings.tabs.general.name": {
|
"instance.settings.tabs.general.name": {
|
||||||
"message": "Nama"
|
"message": "Nama"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.general.update-channel.alpha": {
|
||||||
|
"message": "Alfa"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.general.update-channel.beta": {
|
||||||
|
"message": "Beta"
|
||||||
|
},
|
||||||
|
"instance.settings.tabs.general.update-channel.release": {
|
||||||
|
"message": "Terbitan"
|
||||||
|
},
|
||||||
"instance.settings.tabs.hooks": {
|
"instance.settings.tabs.hooks": {
|
||||||
"message": "Cangkuk pelancaran"
|
"message": "Cangkuk pelancaran"
|
||||||
},
|
},
|
||||||
@@ -823,26 +835,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Pemuat adalah disediakan oleh pelayan"
|
"message": "Pemuat adalah disediakan oleh pelayan"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Sesuatu fail hanya disemak jika ia dimuat naik ke Modrinth, tanpa mengira format failnya (termasuk .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Jangan tunjukkan amaran ini lagi"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Sahkan pemasangan"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Pasangkan juga"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Perisian hasad sering diedarkan melalui fail pek mod dengan berkongsinya di platform seperti Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Kami tidak dapat menemui fail ini di Modrinth. Kami sangat mengesyorkan anda untuk hanya memasang fail daripada sumber yang anda percayai."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Amaran fail tidak diketahui"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,87 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Verberg meer actieve instanties"
|
"message": "Verberg meer actieve instanties"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Gekopieerd"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Details kopiëren"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "Sluiten"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "Instantie openen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "Opnieuw proberen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Geannuleerd vanwege het sluiten van de app"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Modpack kon niet gelezen worden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Geannuleerd"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "Opschonen is niet voltooid"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Bestanden konden niet gedownload worden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Gedownloade bestand is beschadigd"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Bestanden konden niet opgeslagen worden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "Downloaden kon niet worden voltooid"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "Instantie kon niet gevonden worden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "Bestandspad is ongeldig"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Modpack-gegevens ongeldig"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Modpack-bestanden bevatten ongeldige metagegevens"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "Installatie van Java kon niet worden voltooid"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "Instellen van loader is mislukt"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Lokale gegevens konden niet bijgewerkt worden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "Instellen van Minecraft is mislukt"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Modrinth kon niet bereikt worden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Geen schrijfrechten"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Pack kon niet gedownload worden"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Er is iets misgegaan"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "Onbekende instantie"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "Installaties"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Maak primaire instantie"
|
"message": "Maak primaire instantie"
|
||||||
},
|
},
|
||||||
@@ -44,6 +125,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Bekijk logs"
|
"message": "Bekijk logs"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Alles accepteren"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Advertenties maken Modrinth mogelijk en financieren de uitbetalingen aan makers. Onze partners kunnen cookies in de app opslaan of gebruiken om advertenties te personaliseren en de prestaties te meten."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Voorkeuren beheren"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Alles afwijzen"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Je privacy en hoe advertenties Modrinth ondersteunen"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Activeert geavanceerde weergaves zoals blur effecten die mogelijke prestatieproblemen opleveren zonder hardware-versnelde weergeving."
|
"message": "Activeert geavanceerde weergaves zoals blur effecten die mogelijke prestatieproblemen opleveren zonder hardware-versnelde weergeving."
|
||||||
},
|
},
|
||||||
@@ -101,6 +197,12 @@
|
|||||||
"app.appearance-settings.show-play-time.title": {
|
"app.appearance-settings.show-play-time.title": {
|
||||||
"message": "Speeltijd laten zien"
|
"message": "Speeltijd laten zien"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "Bevestigingen met een laag risico, zoals het installeren van dubbele modpacks, het verwijderen van normale inhoud, bulkupdates, het ontkoppelen van modpacks en reparatieverzoeken, worden automatisch overgeslagen. Waarschuwingen voor gevaarlijke dingen worden nog steeds weergegeven."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "Niet-essentiële waarschuwingen overslaan"
|
||||||
|
},
|
||||||
"app.appearance-settings.toggle-sidebar.description": {
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
"message": "Schakelt de mogelijkheid om de zijbalk in- of uit te schakelen in."
|
"message": "Schakelt de mogelijkheid om de zijbalk in- of uit te schakelen in."
|
||||||
},
|
},
|
||||||
@@ -141,19 +243,19 @@
|
|||||||
"message": "Terug naar instantie"
|
"message": "Terug naar instantie"
|
||||||
},
|
},
|
||||||
"app.browse.discover-content": {
|
"app.browse.discover-content": {
|
||||||
"message": "Ontdek content"
|
"message": "Inhoud ontdekken"
|
||||||
},
|
},
|
||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Ontdek servers"
|
"message": "Ontdek servers"
|
||||||
},
|
},
|
||||||
"app.browse.hide-added-servers": {
|
"app.browse.hide-added-servers": {
|
||||||
"message": "Verberg al toegevoegde servers"
|
"message": "Al toegevoegde servers verbergen"
|
||||||
},
|
},
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacks"
|
"message": "Modpacks"
|
||||||
},
|
},
|
||||||
"app.browse.server-instance-content-warning": {
|
"app.browse.server-instance-content-warning": {
|
||||||
"message": "Het toevoegen van content kan de compatibiliteit verbreken bij het verbinden met de server. Alle toegevoegde inhoud gaat ook verloren wanneer u de content van de serverinstantie bijwerkt."
|
"message": "Het toevoegen van inhoud kan de compatibiliteit verstoren bij het verbinden met de server. Eventuele toegevoegde inhoud gaat bovendien verloren wanneer je de inhoud van de serverinstantie bijwerkt."
|
||||||
},
|
},
|
||||||
"app.browse.server.installing": {
|
"app.browse.server.installing": {
|
||||||
"message": "Installeren"
|
"message": "Installeren"
|
||||||
@@ -171,7 +273,7 @@
|
|||||||
"message": "Exporteer modpack"
|
"message": "Exporteer modpack"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
"app.export-modal.modpack-name-label": {
|
||||||
"message": "Modpack Naam"
|
"message": "Naam van modpack"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Modpack naam"
|
"message": "Modpack naam"
|
||||||
@@ -182,8 +284,62 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.downloading_content": {
|
||||||
|
"message": "Inhoud aan het downloaden"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_minecraft": {
|
||||||
|
"message": "Minecraft aan het downloaden"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_pack_file": {
|
||||||
|
"message": "Pakketbestand aan het downloaden"
|
||||||
|
},
|
||||||
|
"app.install.phase.extracting_overrides": {
|
||||||
|
"message": "Overschrijvingen eruit halen"
|
||||||
|
},
|
||||||
|
"app.install.phase.finalizing": {
|
||||||
|
"message": "Aan het afronden"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_instance": {
|
||||||
|
"message": "In de wachtrij voor installatie"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java": {
|
||||||
|
"message": "Java aan het voorbereiden"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "Java {version} aan het downloaden"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "Java {version} aan het uitpakken"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "Java {version} aan het ophalen"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.resolving": {
|
||||||
|
"message": "Java {version} aan het voorbereiden"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "Java {version} aan het valideren"
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "Paketmanifest aan het lezen"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_loader": {
|
||||||
|
"message": "Loader wordt bepaald"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_minecraft": {
|
||||||
|
"message": "Minecraft wordt bepaald"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_pack": {
|
||||||
|
"message": "Inhoud aan het bepalen"
|
||||||
|
},
|
||||||
|
"app.install.phase.rolling_back": {
|
||||||
|
"message": "Aan het terugdraaien"
|
||||||
|
},
|
||||||
|
"app.install.phase.running_loader_processors": {
|
||||||
|
"message": "Loader-processors aan het uitvoeren"
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Alle data van je instantie zal permanent verwijderd worden, inclusief al je werelden, voorkeuren, en alle geïnstalleerde content."
|
"message": "Alle gegevens van je instantie worden definitief verwijderd, inclusief je werelden, configuraties en alle geïnstalleerde inhoud."
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.admonition-header": {
|
"app.instance.confirm-delete.admonition-header": {
|
||||||
"message": "Deze actie kan niet ongedaan gemaakt worden"
|
"message": "Deze actie kan niet ongedaan gemaakt worden"
|
||||||
@@ -206,6 +362,15 @@
|
|||||||
"app.instance.modpack-already-installed.instance": {
|
"app.instance.modpack-already-installed.instance": {
|
||||||
"message": "Instantie"
|
"message": "Instantie"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "{current, number}/{total, number} projecten aan het downloaden..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
|
"message": "Update aan het afronden..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.resolving-versions": {
|
||||||
|
"message": "Versies worden bepaald..."
|
||||||
|
},
|
||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "project"
|
"message": "project"
|
||||||
},
|
},
|
||||||
@@ -230,6 +395,18 @@
|
|||||||
"app.instance.worlds.browse-servers": {
|
"app.instance.worlds.browse-servers": {
|
||||||
"message": "Zoek servers"
|
"message": "Zoek servers"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.delete-button": {
|
||||||
|
"message": "Wereld verwijderen"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.title": {
|
||||||
|
"message": "Wereld verwijderen"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
|
"message": "Deze wereld wordt definitief uit deze instantie verwijderd. Deze actie kan niet ongedaan worden gemaakt."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
|
"message": "{name} verwijderen"
|
||||||
|
},
|
||||||
"app.instance.worlds.filter-modded": {
|
"app.instance.worlds.filter-modded": {
|
||||||
"message": "Gemod"
|
"message": "Gemod"
|
||||||
},
|
},
|
||||||
@@ -248,53 +425,80 @@
|
|||||||
"app.instance.worlds.no-worlds-heading": {
|
"app.instance.worlds.no-worlds-heading": {
|
||||||
"message": "Noch servers noch werelden toegevoegd"
|
"message": "Noch servers noch werelden toegevoegd"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.remove-button": {
|
||||||
|
"message": "Server verwijderen"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.title": {
|
||||||
|
"message": "Server verwijderen"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-body": {
|
||||||
|
"message": "Deze server wordt verwijderd uit je serverlijst en uit de serverlijst in het spel. Je kunt hem later weer toevoegen als je het adres weet."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-header": {
|
||||||
|
"message": "{name} verwijderen"
|
||||||
|
},
|
||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Zoek werelden"
|
"message": "Zoek werelden"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Content vereist"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Installeer om te spelen"
|
"message": "Installeer om te spelen"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Toch installeren"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Installeer"
|
"message": "Installeer"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Deze uitnodiging is aangemaakt door een andere Modrinth-gebruiker, niet door Modrinth zelf. Accepteer alleen uitnodigingen van mensen die je vertrouwt."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural,one {# mod}other {# mods}}"
|
"message": "{count, plural,one {# mod}other {# mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "Vereist modpack"
|
"message": "Een bestand wordt alleen beoordeeld als het op Modrinth wordt gepubliceerd, ongeacht het bestandsformaat (inclusief .mrpack)."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Deze server vereist mods om te spelen. Klik op Installeer om de vereiste bestanden van Modrinth in te stellen, en start direct in de server."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Gedeelde instantie"
|
"message": "Gedeelde instantie"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "Gedeelde server instantie"
|
"message": "Dit server-modpack bevat bestanden die niet op Modrinth zijn gepubliceerd. We raden je ten zeerste aan om alleen bestanden te installeren uit bronnen die je vertrouwt."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Waarschuwing voor onbekende bestanden"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Onbekende bestanden"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Toon content"
|
"message": "Inhoud bekijken"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Update om te spelen"
|
"message": "Update om te spelen"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "Update vereist"
|
"message": "Verwijderde"
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Een update is vereist om {name} te spelen. Update naar de laatste versie om het spel te starten."
|
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Dit project is al geïnstalleerd"
|
"message": "Dit project is al geïnstalleerd"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Versie wijzigen"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Terug naar Ontdekken"
|
"message": "Terug naar Ontdekken"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Installeer content naar instantie"
|
"message": "Alle versies"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Downloaden in de browser"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Wordt geïnstalleerd"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Al geïnstalleerd"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Ontwikkelaarsmodus ingeschakeld."
|
"message": "Ontwikkelaarsmodus ingeschakeld."
|
||||||
@@ -302,6 +506,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "v{version} wordt gedownload"
|
"message": "v{version} wordt gedownload"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Advertenties maken Modrinth mogelijk en financieren de uitbetalingen aan makers. Onze partners kunnen cookies in de app opslaan of gebruiken om advertenties te personaliseren en de prestaties te meten. Je kunt je hieronder afmelden of je voorkeuren beheren."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Uiterlijk"
|
"message": "Uiterlijk"
|
||||||
},
|
},
|
||||||
@@ -344,6 +551,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Fout bij het verwerken van het bestand"
|
"message": "Fout bij het verwerken van het bestand"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Deze skin maakt gebruik van functies uit de {ears} mod"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Skin aanpassen"
|
"message": "Skin aanpassen"
|
||||||
},
|
},
|
||||||
@@ -411,11 +621,14 @@
|
|||||||
"message": "Je skinvolgorde kon niet worden opgeslagen."
|
"message": "Je skinvolgorde kon niet worden opgeslagen."
|
||||||
},
|
},
|
||||||
"app.skins.reorder-error.title": {
|
"app.skins.reorder-error.title": {
|
||||||
"message": "Het herschikken van skins is mislukt."
|
"message": "Herschikken van skins is mislukt"
|
||||||
},
|
},
|
||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -467,11 +680,17 @@
|
|||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Skinkiezer"
|
"message": "Skinkiezer"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Uitschakelen"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Inschakelen"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"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."
|
"message": "Modrinth App v{version} is klaar met downloaden. Herlaad om nu te updaten, of automatisch wanneer je de Modrinth App afsluit."
|
||||||
},
|
},
|
||||||
"app.update-popup.body.linux": {
|
"app.update-popup.body.linux": {
|
||||||
"message": "Modrinth App v{version} is beschikbaar. Gebruik je pakketbeheerder om te updaten voor de laatste functies en oplossingen!"
|
"message": "De Modrinth-app v{version} is beschikbaar. Gebruik je pakketbeheerder om bij te werken en zo de nieuwste functies en verbeteringen te krijgen!"
|
||||||
},
|
},
|
||||||
"app.update-popup.body.metered": {
|
"app.update-popup.body.metered": {
|
||||||
"message": "Modrinth App v{version} is nu beschikbaar! Omdat je nu op een netwerk met datalimiet zit, is de download niet automatisch gestart."
|
"message": "Modrinth App v{version} is nu beschikbaar! Omdat je nu op een netwerk met datalimiet zit, is de download niet automatisch gestart."
|
||||||
@@ -578,6 +797,33 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Log in op een Modrinth account</link> om vrienden toe te voegen en zien wat zij spelen!"
|
"message": "<link>Log in op een Modrinth account</link> om vrienden toe te voegen en zien wat zij spelen!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Snelkoppeling maken"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Modpack exporteren"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Instantie starten"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "Meer acties"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Map openen"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Herstellen"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Instellingen voor instantie"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Aan het opstarten..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Aan het stoppen..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Toevoegen en spelen"
|
"message": "Toevoegen en spelen"
|
||||||
},
|
},
|
||||||
@@ -620,6 +866,9 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Opslaan als..."
|
"message": "Opslaan als..."
|
||||||
},
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Nog nooit gespeeld"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Adres"
|
"message": "Adres"
|
||||||
},
|
},
|
||||||
@@ -642,7 +891,7 @@
|
|||||||
"message": "Verwijder instantie"
|
"message": "Verwijder instantie"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.delete.description": {
|
"instance.settings.tabs.general.delete.description": {
|
||||||
"message": "Verwijdert permanent een instantie van je apparaat, inclusief je werelden, instellingen en alle geïnstalleerde inhoud. Wees voorzichtig, zodra je een instantie verwijdert, is het niet meer mogelijk om deze te herstellen."
|
"message": "Hiermee wordt een instantie definitief van je apparaat verwijderd, inclusief je werelden, instellingen en alle geïnstalleerde inhoud. Wees voorzichtig, want zodra je een instantie hebt verwijderd, kun je deze niet meer herstellen."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.general.deleting.button": {
|
"instance.settings.tabs.general.deleting.button": {
|
||||||
"message": "Verwijderen..."
|
"message": "Verwijderen..."
|
||||||
@@ -833,6 +1082,9 @@
|
|||||||
"instance.worlds.copy_address": {
|
"instance.worlds.copy_address": {
|
||||||
"message": "Kopieer adres"
|
"message": "Kopieer adres"
|
||||||
},
|
},
|
||||||
|
"instance.worlds.create_shortcut": {
|
||||||
|
"message": "Snelkoppeling maken"
|
||||||
|
},
|
||||||
"instance.worlds.dont_show_on_home": {
|
"instance.worlds.dont_show_on_home": {
|
||||||
"message": "Niet tonen op de startpagina"
|
"message": "Niet tonen op de startpagina"
|
||||||
},
|
},
|
||||||
@@ -884,6 +1136,27 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Log in bij Minecraft"
|
"message": "Log in bij Minecraft"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Je hebt een Microsoft-account nodig waarop Minecraft is geregistreerd voordat je het spel kunt starten en spelen."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Meld je aan bij een Microsoft-account"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Heb je nog geen account?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Minecraft kopen"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Hulp krijgen"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft vereist"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Aanmelden bij Microsoft"
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Aangeboden door de instantie"
|
"message": "Aangeboden door de instantie"
|
||||||
},
|
},
|
||||||
@@ -907,26 +1180,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader is gegeven door de server"
|
"message": "Loader is gegeven door de server"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Een bestand wordt alleen beoordeeld als het naar Modrinth is geüpload, ongeacht het bestandsformaat (inclusief .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Toon deze waarschuwing niet opnieuw"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Bevestig installatie"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Installeer toch"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Malware wordt vaak verspreid via modpack-bestanden door ze te delen op platforms zoals Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "We konden dit bestand niet vinden op Modrinth. We raden ten zeerste aan om alleen bestanden te installeren van bronnen die u vertrouwt."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Waarschuwing voor onbekend bestand"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,220 @@
|
|||||||
{
|
{
|
||||||
|
"app.action-bar.downloading-java": {
|
||||||
|
"message": "Laster ned Java {version}"
|
||||||
|
},
|
||||||
|
"app.action-bar.downloading-update": {
|
||||||
|
"message": "Laster ned oppdatering"
|
||||||
|
},
|
||||||
|
"app.action-bar.downloads": {
|
||||||
|
"message": "Nedlastninger"
|
||||||
|
},
|
||||||
|
"app.action-bar.hide-more-running-instances": {
|
||||||
|
"message": "Skjul flere kjørende tilfeller"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "Åpne tilfelle"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "Prøv igjen"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "Ukjent tilfelle"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "Installeringer"
|
||||||
|
},
|
||||||
|
"app.action-bar.make-primary-instance": {
|
||||||
|
"message": "Gjør om til primærtilfelle"
|
||||||
|
},
|
||||||
|
"app.action-bar.no-instances-running": {
|
||||||
|
"message": "Ingen kjørende tilfeller"
|
||||||
|
},
|
||||||
|
"app.action-bar.offline": {
|
||||||
|
"message": "Uten nett"
|
||||||
|
},
|
||||||
|
"app.action-bar.primary-instance": {
|
||||||
|
"message": "Primærtilfelle"
|
||||||
|
},
|
||||||
|
"app.action-bar.reload-to-update": {
|
||||||
|
"message": "Last inn på nytt for å oppdatere"
|
||||||
|
},
|
||||||
|
"app.action-bar.show-more-running-instances": {
|
||||||
|
"message": "Vis flere kjørende tilfeller"
|
||||||
|
},
|
||||||
|
"app.action-bar.stop-instance": {
|
||||||
|
"message": "Stopp tilfelle"
|
||||||
|
},
|
||||||
|
"app.action-bar.update": {
|
||||||
|
"message": "Oppdater"
|
||||||
|
},
|
||||||
|
"app.action-bar.view-active-downloads": {
|
||||||
|
"message": "Vis aktive nedlastninger"
|
||||||
|
},
|
||||||
|
"app.action-bar.view-instance": {
|
||||||
|
"message": "Vis tilfelle"
|
||||||
|
},
|
||||||
|
"app.action-bar.view-logs": {
|
||||||
|
"message": "Vis logger"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
|
"message": "Skrur på avansert rendering, som for eksempel uskarphetseffekter, som kan forårsake ytelsesproblemer om man ikke har maskinvareaksellerert rendering."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.advanced-rendering.title": {
|
||||||
|
"message": "Avansert rendering"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.color-theme.description": {
|
||||||
|
"message": "Velg ditt foretrukne fargetema for Modrinth App."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.color-theme.title": {
|
||||||
|
"message": "Fargetema"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.default-landing-page.description": {
|
||||||
|
"message": "Endre sida som vises når launcheren åpnes."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.default-landing-page.home": {
|
||||||
|
"message": "Hjem"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.default-landing-page.library": {
|
||||||
|
"message": "Bibliotek"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.default-landing-page.title": {
|
||||||
|
"message": "Åpningsside"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.hide-nametag.description": {
|
||||||
|
"message": "Skjuler navnelappen over din spiller på utseende siden."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.hide-nametag.title": {
|
||||||
|
"message": "Gjøm navnelapp"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.minimize-launcher.title": {
|
||||||
|
"message": "Minimer launcheren"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.select-option": {
|
||||||
|
"message": "Velg et alternativ"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.show-play-time.description": {
|
||||||
|
"message": "Viser hvor lenge du har spilt et tilfelle."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.show-play-time.title": {
|
||||||
|
"message": "Vis spilletid"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "Hopper automatisk over lav-rissiko fastslåelser som modpakkeinstalasjonsduplikat, vanlig innholdsletting, bolkoppdateringer, avkoble modpakker, og reparasjonsprompter. Farlige advarsler vil fortsatt vises."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "Hopp over mindre viktige advarsler"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
|
"message": "Aktiverer evnen til å skru sidefeltet av/på."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.toggle-sidebar.title": {
|
||||||
|
"message": "Sidefeltsveksling"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.unknown-pack-warning.description": {
|
||||||
|
"message": "Hvis du prøver å laste ned en Modrinth Pakke fil (.mrpack) som er ukjent for Modrinth så kommer vi til å forsikre oss om at du forstår risikoene før du installerer den."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.unknown-pack-warning.title": {
|
||||||
|
"message": "Advar meg før jeg installerer ukjente modpakker"
|
||||||
|
},
|
||||||
"app.auth-servers.unreachable.body": {
|
"app.auth-servers.unreachable.body": {
|
||||||
"message": "Minecraft-autentiseringsservere kan være nede for øyeblikket. Kontroller internettforbindelsen din og prøv igjen senere."
|
"message": "Minecraft-autentiseringsservere kan være nede for øyeblikket. Kontroller internettforbindelsen din og prøv igjen senere."
|
||||||
},
|
},
|
||||||
"app.auth-servers.unreachable.header": {
|
"app.auth-servers.unreachable.header": {
|
||||||
"message": "Kan ikke nå autentiseringsservere"
|
"message": "Kan ikke nå autentiseringsservere"
|
||||||
},
|
},
|
||||||
|
"app.browse.add-servers-to-instance": {
|
||||||
|
"message": "Legger til server til tilfelle"
|
||||||
|
},
|
||||||
|
"app.browse.add-to-an-instance": {
|
||||||
|
"message": "Legg til til et tilfelle"
|
||||||
|
},
|
||||||
|
"app.browse.add-to-instance": {
|
||||||
|
"message": "Legg til til tilfelle"
|
||||||
|
},
|
||||||
|
"app.browse.add-to-instance-name": {
|
||||||
|
"message": "Legg til til {instanceName}"
|
||||||
|
},
|
||||||
|
"app.browse.added": {
|
||||||
|
"message": "Lagt til"
|
||||||
|
},
|
||||||
|
"app.browse.already-added": {
|
||||||
|
"message": "Allerede lagt til"
|
||||||
|
},
|
||||||
|
"app.browse.back-to-instance": {
|
||||||
|
"message": "Tilbake til tilfelle"
|
||||||
|
},
|
||||||
|
"app.browse.discover-content": {
|
||||||
|
"message": "Oppdag innhold"
|
||||||
|
},
|
||||||
|
"app.browse.discover-servers": {
|
||||||
|
"message": "Oppdag servere"
|
||||||
|
},
|
||||||
|
"app.browse.hide-added-servers": {
|
||||||
|
"message": "Gjem servere som allerede er lagt til"
|
||||||
|
},
|
||||||
|
"app.browse.project-type.modpacks": {
|
||||||
|
"message": "Modpakker"
|
||||||
|
},
|
||||||
|
"app.browse.server-instance-content-warning": {
|
||||||
|
"message": "Å legge til innhold kan ødelegge komatibilitet når du blir med i serveren. Alt tilleggsinnhold vil også forsvinne når du oppdaterer servertilfelleinnholdet."
|
||||||
|
},
|
||||||
|
"app.browse.server.installing": {
|
||||||
|
"message": "Installerer"
|
||||||
|
},
|
||||||
|
"app.content-install.no-compatible-versions": {
|
||||||
|
"message": "Ingen tilgjengelige versjoner matcher {compatibilityLabel}. Velg en versjon for å installere uansett. Avhengigheter vil ikke bli installert automatisk."
|
||||||
|
},
|
||||||
|
"app.export-modal.description-placeholder": {
|
||||||
|
"message": "Skriv en modpakkebeskrivelse..."
|
||||||
|
},
|
||||||
|
"app.export-modal.export-button": {
|
||||||
|
"message": "Eksperter"
|
||||||
|
},
|
||||||
|
"app.export-modal.header": {
|
||||||
|
"message": "Eksperter modpakke"
|
||||||
|
},
|
||||||
|
"app.export-modal.modpack-name-label": {
|
||||||
|
"message": "Navn på modpakke"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "Validerer Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "Leser pakkemanifest"
|
||||||
|
},
|
||||||
|
"app.instance.confirm-delete.delete-button": {
|
||||||
|
"message": "Slett tilfelle"
|
||||||
|
},
|
||||||
|
"app.instance.confirm-delete.header": {
|
||||||
|
"message": "Slett tilfelle"
|
||||||
|
},
|
||||||
|
"app.instance.modpack-already-installed.create": {
|
||||||
|
"message": "Opprett"
|
||||||
|
},
|
||||||
|
"app.instance.modpack-already-installed.header": {
|
||||||
|
"message": "Modpakka er allerede installert"
|
||||||
|
},
|
||||||
|
"app.instance.modpack-already-installed.instance": {
|
||||||
|
"message": "Tilfelle"
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "Laster ned {current, number}/{total, number} prosjekter..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
|
"message": "Fullfører oppdatering..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.content-type-project": {
|
||||||
|
"message": "prosjekt"
|
||||||
|
},
|
||||||
|
"app.instance.mods.project-was-added": {
|
||||||
|
"message": "\"{name}\" ble lagt til"
|
||||||
|
},
|
||||||
|
"app.instance.mods.projects-were-added": {
|
||||||
|
"message": "{count} prosjekter ble lagt til"
|
||||||
|
},
|
||||||
|
"app.instance.mods.share-text": {
|
||||||
|
"message": "Sjekk ut prosjektene jeg bruker i min modpakke!"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Installer for å spille"
|
"message": "Installer for å spille"
|
||||||
},
|
},
|
||||||
@@ -12,23 +222,14 @@
|
|||||||
"message": "Installer"
|
"message": "Installer"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {#mod} other {# mods}}"
|
"message": "{count, plural, one {#mod} other {# modder}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Delt instans"
|
"message": "Delt tilfelle"
|
||||||
},
|
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
|
||||||
"message": "Delt serverinstans"
|
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Oppdater for å spille"
|
"message": "Oppdater for å spille"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
|
||||||
"message": "Krever oppdatering"
|
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Ei oppdatering er påkrevd for å spille {name}. Vær så snill å oppdater til den siste versjonen av spillet for å spille det."
|
|
||||||
},
|
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Utviklermodus aktivert."
|
"message": "Utviklermodus aktivert."
|
||||||
},
|
},
|
||||||
@@ -39,7 +240,7 @@
|
|||||||
"message": "Utseende"
|
"message": "Utseende"
|
||||||
},
|
},
|
||||||
"app.settings.tabs.default-instance-options": {
|
"app.settings.tabs.default-instance-options": {
|
||||||
"message": "Standard instansinstillinger"
|
"message": "Vanlige tilfelleinstillinger"
|
||||||
},
|
},
|
||||||
"app.settings.tabs.java-installations": {
|
"app.settings.tabs.java-installations": {
|
||||||
"message": "Java installasjoner"
|
"message": "Java installasjoner"
|
||||||
@@ -102,10 +303,10 @@
|
|||||||
"message": "Aktiv"
|
"message": "Aktiv"
|
||||||
},
|
},
|
||||||
"friends.heading.offline": {
|
"friends.heading.offline": {
|
||||||
"message": "Offline"
|
"message": "Av"
|
||||||
},
|
},
|
||||||
"friends.heading.online": {
|
"friends.heading.online": {
|
||||||
"message": "Online"
|
"message": "På"
|
||||||
},
|
},
|
||||||
"friends.heading.pending": {
|
"friends.heading.pending": {
|
||||||
"message": "Ventende"
|
"message": "Ventende"
|
||||||
@@ -246,10 +447,10 @@
|
|||||||
"message": "Før oppstart"
|
"message": "Før oppstart"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.pre-launch.description": {
|
"instance.settings.tabs.hooks.pre-launch.description": {
|
||||||
"message": "Kørt før instansen startes."
|
"message": "Kjøres før tilfellet startes."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.pre-launch.enter": {
|
"instance.settings.tabs.hooks.pre-launch.enter": {
|
||||||
"message": "Skriv inn kommando før start..."
|
"message": "Skriv inn forstartskommando..."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.title": {
|
"instance.settings.tabs.hooks.title": {
|
||||||
"message": "Spillstartkroker"
|
"message": "Spillstartkroker"
|
||||||
@@ -258,7 +459,7 @@
|
|||||||
"message": "Wrapper"
|
"message": "Wrapper"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.wrapper.description": {
|
"instance.settings.tabs.hooks.wrapper.description": {
|
||||||
"message": "Wrapper-kommando for å starte Minecraft."
|
"message": "Innpakningskommando for å starte Minecraft."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.hooks.wrapper.enter": {
|
"instance.settings.tabs.hooks.wrapper.enter": {
|
||||||
"message": "Skriv inn wrapper-kommando..."
|
"message": "Skriv inn wrapper-kommando..."
|
||||||
@@ -272,6 +473,9 @@
|
|||||||
"instance.settings.tabs.java": {
|
"instance.settings.tabs.java": {
|
||||||
"message": "Java og minne"
|
"message": "Java og minne"
|
||||||
},
|
},
|
||||||
|
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||||
|
"message": "Egendefinert minneallokasjon"
|
||||||
|
},
|
||||||
"instance.settings.tabs.java.environment-variables": {
|
"instance.settings.tabs.java.environment-variables": {
|
||||||
"message": "Miljøvariabler"
|
"message": "Miljøvariabler"
|
||||||
},
|
},
|
||||||
@@ -303,7 +507,7 @@
|
|||||||
"message": "Høyde"
|
"message": "Høyde"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.height.description": {
|
"instance.settings.tabs.window.height.description": {
|
||||||
"message": "Høyde av spillvindu når spillet startes."
|
"message": "Høyden til spillvinduet når spillet startes."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.height.enter": {
|
"instance.settings.tabs.window.height.enter": {
|
||||||
"message": "Angi høyde..."
|
"message": "Angi høyde..."
|
||||||
@@ -312,7 +516,7 @@
|
|||||||
"message": "Bredde"
|
"message": "Bredde"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.width.description": {
|
"instance.settings.tabs.window.width.description": {
|
||||||
"message": "Bredde av spillvindu når spillet startes."
|
"message": "Bredden til spillvinduet når spillet startes."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.window.width.enter": {
|
"instance.settings.tabs.window.width.enter": {
|
||||||
"message": "Angi bredde..."
|
"message": "Angi bredde..."
|
||||||
@@ -330,7 +534,7 @@
|
|||||||
"message": "Ikke vis på Hjem"
|
"message": "Ikke vis på Hjem"
|
||||||
},
|
},
|
||||||
"instance.worlds.game_already_open": {
|
"instance.worlds.game_already_open": {
|
||||||
"message": "Instansen er allerede open"
|
"message": "Tilfellet er allerede open"
|
||||||
},
|
},
|
||||||
"instance.worlds.hardcore": {
|
"instance.worlds.hardcore": {
|
||||||
"message": "Hardbarket modus"
|
"message": "Hardbarket modus"
|
||||||
@@ -348,7 +552,7 @@
|
|||||||
"message": "Du kan bare hoppe rett inn i enkeltspiller-verdener på Minecraft 1.20+"
|
"message": "Du kan bare hoppe rett inn i enkeltspiller-verdener på Minecraft 1.20+"
|
||||||
},
|
},
|
||||||
"instance.worlds.play_instance": {
|
"instance.worlds.play_instance": {
|
||||||
"message": "Spill instans"
|
"message": "Spill tilfelle"
|
||||||
},
|
},
|
||||||
"instance.worlds.view_instance": {
|
"instance.worlds.view_instance": {
|
||||||
"message": "Vis instans"
|
"message": "Vis instans"
|
||||||
|
|||||||
@@ -9,7 +9,13 @@
|
|||||||
"message": "Pobrania"
|
"message": "Pobrania"
|
||||||
},
|
},
|
||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Ukryj włączone instancje"
|
"message": "Ukryj aktywne instancje"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Skopiowano"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Kopiuj szczegóły"
|
||||||
},
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Odrzuć"
|
"message": "Odrzuć"
|
||||||
@@ -20,9 +26,72 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Spróbuj ponownie"
|
"message": "Spróbuj ponownie"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Anulowano z powodu zamknięcia aplikacji"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Nie można było odczytać paczki modów"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Anulowano"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "Czyszczenie nie powiodło się"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Nie udało się pobrać plików"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "Pobrany plik jest uszkodzony"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Nie udało się zapisać plików"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "Nie można było ukończyć pobierania"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "Nie znaleziono instancji"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "Ścieżka plików jest niewłaściwa"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Niewłaściwe dane paczki modów"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Pliki paczki modów zawierają niewłaściwe metadane"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "Ustawianie Javy nie powiodło się"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "Ustawianie loadera nie powiodło się"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Nie udało się zaktualizować danych lokalnych"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "Ustawianie Minecraft nie powiodło się"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Nie udało się połączyć z serwerami Modrinth"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Brak permisji, aby zapisać pliki"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Pobieranie paczki nie powiodło się"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Coś poszło nie tak"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Nieznana instancja"
|
"message": "Nieznana instancja"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.updating-shared-content": {
|
||||||
|
"message": "Aktualizowanie udostępnionych zasobów"
|
||||||
|
},
|
||||||
"app.action-bar.installs": {
|
"app.action-bar.installs": {
|
||||||
"message": "Instalacje"
|
"message": "Instalacje"
|
||||||
},
|
},
|
||||||
@@ -30,7 +99,7 @@
|
|||||||
"message": "Ustaw jako główną instancję"
|
"message": "Ustaw jako główną instancję"
|
||||||
},
|
},
|
||||||
"app.action-bar.no-instances-running": {
|
"app.action-bar.no-instances-running": {
|
||||||
"message": "Żadna instancja nie jest włączona"
|
"message": "Brak włączonych instancji"
|
||||||
},
|
},
|
||||||
"app.action-bar.offline": {
|
"app.action-bar.offline": {
|
||||||
"message": "Offline"
|
"message": "Offline"
|
||||||
@@ -39,7 +108,7 @@
|
|||||||
"message": "Główna instancja"
|
"message": "Główna instancja"
|
||||||
},
|
},
|
||||||
"app.action-bar.reload-to-update": {
|
"app.action-bar.reload-to-update": {
|
||||||
"message": "Załaduj ponownie, by zaktualizować"
|
"message": "Załaduj ponownie, aby zaktualizować"
|
||||||
},
|
},
|
||||||
"app.action-bar.show-more-running-instances": {
|
"app.action-bar.show-more-running-instances": {
|
||||||
"message": "Pokaż więcej włączonych instancji"
|
"message": "Pokaż więcej włączonych instancji"
|
||||||
@@ -59,6 +128,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Pokaż logi"
|
"message": "Pokaż logi"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Zaakceptuj wszystko"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Reklamy pozwalają Modrinth oraz fundują wypłaty twórców. Nasi partnerzy mogą zachować lub uzyskać dostęp ciasteczek w aplikacji, żeby spersonalizować reklamy i zmierzyć wydajność."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Zarządzaj preferencjami"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Odrzuć wszystkie"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Twoja prywatność i jak reklamy wspierają Modrinth"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Włącza zaawansowane renderowanie, takie jak efekty rozmycia, które może powodować problemy z wydajnością bez sprzętowej akceleracji renderowania."
|
"message": "Włącza zaawansowane renderowanie, takie jak efekty rozmycia, które może powodować problemy z wydajnością bez sprzętowej akceleracji renderowania."
|
||||||
},
|
},
|
||||||
@@ -66,7 +150,7 @@
|
|||||||
"message": "Zaawansowane renderowanie"
|
"message": "Zaawansowane renderowanie"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.color-theme.description": {
|
"app.appearance-settings.color-theme.description": {
|
||||||
"message": "Wybierz preferowany motyw w Modrinth app."
|
"message": "Wybierz preferowany motyw kolorystyczny dla Modrinth App."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.color-theme.title": {
|
"app.appearance-settings.color-theme.title": {
|
||||||
"message": "Motyw"
|
"message": "Motyw"
|
||||||
@@ -84,10 +168,10 @@
|
|||||||
"message": "Domyślna strona główna"
|
"message": "Domyślna strona główna"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.hide-nametag.description": {
|
"app.appearance-settings.hide-nametag.description": {
|
||||||
"message": "Wyłącza nazwę użytkownika na stronie skórek."
|
"message": "Wyłącza nazwę użytkownika nad modelem gracza na stronie skórek."
|
||||||
},
|
},
|
||||||
"app.appearance-settings.hide-nametag.title": {
|
"app.appearance-settings.hide-nametag.title": {
|
||||||
"message": "Schowaj nazwę"
|
"message": "Ukryj nazwę"
|
||||||
},
|
},
|
||||||
"app.appearance-settings.jump-back-into-worlds.description": {
|
"app.appearance-settings.jump-back-into-worlds.description": {
|
||||||
"message": "Pokazuje ostatnie światy w sekcji \"Wskocz z powrotem do światów\" na stronie głównej."
|
"message": "Pokazuje ostatnie światy w sekcji \"Wskocz z powrotem do światów\" na stronie głównej."
|
||||||
@@ -219,7 +303,7 @@
|
|||||||
"message": "Finalizowanie"
|
"message": "Finalizowanie"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Przygotowywanie instancji"
|
"message": "Oczekuje na instalację"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Przygotowywanie środowiska Java"
|
"message": "Przygotowywanie środowiska Java"
|
||||||
@@ -228,10 +312,10 @@
|
|||||||
"message": "Pobieranie Java {version}"
|
"message": "Pobieranie Java {version}"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java.extracting": {
|
"app.install.phase.preparing_java.extracting": {
|
||||||
"message": "Wypakowywanie Javy {version}"
|
"message": "Wypakowywanie Java {version}"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java.fetching-metadata": {
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
"message": "Pobieranie Javy {version}"
|
"message": "Pobieranie Java {version}"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java.resolving": {
|
"app.install.phase.preparing_java.resolving": {
|
||||||
"message": "Przygotowywanie Java {version}"
|
"message": "Przygotowywanie Java {version}"
|
||||||
@@ -240,10 +324,10 @@
|
|||||||
"message": "Sprawdzanie Java {version}"
|
"message": "Sprawdzanie Java {version}"
|
||||||
},
|
},
|
||||||
"app.install.phase.reading_pack_manifest": {
|
"app.install.phase.reading_pack_manifest": {
|
||||||
"message": "Ustalanie manifestu paczki"
|
"message": "Sprawdzanie manifestu paczki"
|
||||||
},
|
},
|
||||||
"app.install.phase.resolving_loader": {
|
"app.install.phase.resolving_loader": {
|
||||||
"message": "Ustalanie programu ładującego"
|
"message": "Ustalanie loadera"
|
||||||
},
|
},
|
||||||
"app.install.phase.resolving_minecraft": {
|
"app.install.phase.resolving_minecraft": {
|
||||||
"message": "Ustalanie wersji Minecraft"
|
"message": "Ustalanie wersji Minecraft"
|
||||||
@@ -255,13 +339,31 @@
|
|||||||
"message": "Przywracanie"
|
"message": "Przywracanie"
|
||||||
},
|
},
|
||||||
"app.install.phase.running_loader_processors": {
|
"app.install.phase.running_loader_processors": {
|
||||||
"message": "Uruchamianie procesorów programu ładującego"
|
"message": "Uruchamianie procesorów loadera"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.added-label": {
|
||||||
|
"message": "Dodano"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.changes-header": {
|
||||||
|
"message": "Twoje zmiany nie zostały jeszcze udostępnione"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publish-button": {
|
||||||
|
"message": "Opublikuj aktualizację"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.publishing-button": {
|
||||||
|
"message": "Publikowanie..."
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.removed-label": {
|
||||||
|
"message": "Usunięto"
|
||||||
|
},
|
||||||
|
"app.instance.admonitions.shared-instance.review-admonition-header": {
|
||||||
|
"message": "Opublikuj aktualizację"
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Wszystkie dane z Twojej instancji zostaną trwale usunięte, w tym Twoje światy, pliki konfiguracji i jakakolwiek dodana zawartość."
|
"message": "Wszystkie dane z Twojej instancji zostaną trwale usunięte, w tym Twoje światy, pliki konfiguracji i jakakolwiek dodana zawartość."
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.admonition-header": {
|
"app.instance.confirm-delete.admonition-header": {
|
||||||
"message": "Tej akcji nie można odwrócić"
|
"message": "Tej akcji nie można cofnąć"
|
||||||
},
|
},
|
||||||
"app.instance.confirm-delete.delete-button": {
|
"app.instance.confirm-delete.delete-button": {
|
||||||
"message": "Usuń instancję"
|
"message": "Usuń instancję"
|
||||||
@@ -297,13 +399,13 @@
|
|||||||
"message": "Dodano \"{name}\""
|
"message": "Dodano \"{name}\""
|
||||||
},
|
},
|
||||||
"app.instance.mods.share-text": {
|
"app.instance.mods.share-text": {
|
||||||
"message": "Sprawdź projekty, które używam w mojej paczce modów!"
|
"message": "Sprawdź projekty, których używam w mojej paczce modów!"
|
||||||
},
|
},
|
||||||
"app.instance.mods.share-title": {
|
"app.instance.mods.share-title": {
|
||||||
"message": "Udostępnianie zawartości paczki modów"
|
"message": "Udostępnianie zawartości paczki modów"
|
||||||
},
|
},
|
||||||
"app.instance.mods.successfully-uploaded": {
|
"app.instance.mods.successfully-uploaded": {
|
||||||
"message": "Przesyłanie powiodło się"
|
"message": "Przesyłanie zakończone sukcesem"
|
||||||
},
|
},
|
||||||
"app.instance.worlds.add-server": {
|
"app.instance.worlds.add-server": {
|
||||||
"message": "Dodaj serwer"
|
"message": "Dodaj serwer"
|
||||||
@@ -356,29 +458,35 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Szukaj wśród {count} światów..."
|
"message": "Szukaj wśród {count} światów..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Wymagana zawartość"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Zainstaluj, aby grać"
|
"message": "Zainstaluj, aby grać"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Instaluj mimo to"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Zainstaluj"
|
"message": "Zainstaluj"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "To zaproszenie zostało utworzone przez innego użytkownika Modrinth, nie przez firmę Modrinth. Tylko akceptuj zaproszenia od osób, którym ufasz."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {# mod} few {# mody} other {# modów}}"
|
"message": "{count, plural, one {# mod} few {# mody} other {# modów}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "Wymagana paczka modów"
|
"message": "Plik jest sprawdzony tylko, jeżeli został opublikowany na Modrinth, niezależnie od jego formatu (w tym pliki .mrpack)."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Ten serwer wymaga modów, aby na nim grać. Kliknij \"Zainstaluj\" aby otrzymać potrzebne pliki z Modrinth, a potem dołącz bezpośrednio do serwera."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Wspólna instancja"
|
"message": "Wspólna instancja"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "Wspólna instancja serwera"
|
"message": "Ta serwerowa paczka modów zawiera pliki, które nie zostały opublikowane na Modrinth. Zalecamy instalowanie plików tylko ze źródeł, którym ufasz."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Ostrzeżenie o nieznanych plikach"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Nieznane plki"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Pokaż zawartość"
|
"message": "Pokaż zawartość"
|
||||||
@@ -386,20 +494,29 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Zaktualizuj, by grać"
|
"message": "Zaktualizuj, by grać"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "Wymagana jest aktualizacja"
|
"message": "Usunięto"
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Aktualizacja jest wymagana, aby grać w {name}. Proszę zaktualizować do najnowszej wersji, aby uruchomić grę."
|
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Ten projekt jest już zainstalowany"
|
"message": "Ten projekt jest już zainstalowany"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Zmień wersję"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Powróć do odkrywania"
|
"message": "Powróć do odkrywania"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Zainstaluj zasoby do instancji"
|
"message": "Wszystkie wersje"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Pobierz w przeglądarce"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Instalowanie"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Już zainstalowano"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Tryb dewelopera włączony."
|
"message": "Tryb dewelopera włączony."
|
||||||
@@ -407,6 +524,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "Pobieranie v{version}"
|
"message": "Pobieranie v{version}"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Reklamy pozwalają Modrinth oraz fundują wypłaty twórców. Nasi partnerzy mogą zachować lub uzyskać dostęp ciasteczek w aplikacji, żeby spersonalizować reklamy i zmierzyć wydajność. Możesz optować lub zarządzać preferencjami poniżej."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Wygląd"
|
"message": "Wygląd"
|
||||||
},
|
},
|
||||||
@@ -438,25 +558,28 @@
|
|||||||
"message": "Usuń skórkę"
|
"message": "Usuń skórkę"
|
||||||
},
|
},
|
||||||
"app.skins.delete-modal.description": {
|
"app.skins.delete-modal.description": {
|
||||||
"message": "To trwale usunie wybraną skórkę. Tej akcji nie można odwrócić."
|
"message": "To trwale usunie wybraną skórkę. Tej akcji nie można cofnąć."
|
||||||
},
|
},
|
||||||
"app.skins.delete-modal.title": {
|
"app.skins.delete-modal.title": {
|
||||||
"message": "Czy na pewno chcesz usunąć tę skórkę?"
|
"message": "Czy na pewno chcesz usunąć tę skórkę?"
|
||||||
},
|
},
|
||||||
"app.skins.dropped-file-error.text": {
|
"app.skins.dropped-file-error.text": {
|
||||||
"message": "Nie udało się odczytać wybranego pliku."
|
"message": "Nie udało się odczytać upuszczonego pliku."
|
||||||
},
|
},
|
||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Błąd podczas przetwarzania pliku"
|
"message": "Błąd podczas przetwarzania pliku"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Ta skórka używa funkcjonalności modyfikacji {ears}"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Edytuj skina"
|
"message": "Edytuj skórkę"
|
||||||
},
|
},
|
||||||
"app.skins.modal.add-skin-button": {
|
"app.skins.modal.add-skin-button": {
|
||||||
"message": "Dodaj skina"
|
"message": "Dodaj skórkę"
|
||||||
},
|
},
|
||||||
"app.skins.modal.add-title": {
|
"app.skins.modal.add-title": {
|
||||||
"message": "Dodawanie skina"
|
"message": "Dodawanie skórki"
|
||||||
},
|
},
|
||||||
"app.skins.modal.arm-style-section": {
|
"app.skins.modal.arm-style-section": {
|
||||||
"message": "Styl ramion"
|
"message": "Styl ramion"
|
||||||
@@ -474,10 +597,10 @@
|
|||||||
"message": "Peleryny"
|
"message": "Peleryny"
|
||||||
},
|
},
|
||||||
"app.skins.modal.edit-title": {
|
"app.skins.modal.edit-title": {
|
||||||
"message": "Edytuj skina"
|
"message": "Edytowanie skórki"
|
||||||
},
|
},
|
||||||
"app.skins.modal.make-edit-first-tooltip": {
|
"app.skins.modal.make-edit-first-tooltip": {
|
||||||
"message": "Wpierw zmień jakoś skórkę!"
|
"message": "Zmodyfikuj najpierw skórkę!"
|
||||||
},
|
},
|
||||||
"app.skins.modal.no-cape-tooltip": {
|
"app.skins.modal.no-cape-tooltip": {
|
||||||
"message": "Brak peleryny"
|
"message": "Brak peleryny"
|
||||||
@@ -489,7 +612,7 @@
|
|||||||
"message": "Zamień teksturę"
|
"message": "Zamień teksturę"
|
||||||
},
|
},
|
||||||
"app.skins.modal.save-skin-button": {
|
"app.skins.modal.save-skin-button": {
|
||||||
"message": "Zapisz skina"
|
"message": "Zapisz skórkę"
|
||||||
},
|
},
|
||||||
"app.skins.modal.saving-tooltip": {
|
"app.skins.modal.saving-tooltip": {
|
||||||
"message": "Zapisywanie..."
|
"message": "Zapisywanie..."
|
||||||
@@ -521,6 +644,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Builders & Biomes"
|
"message": "Builders & Biomes"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -570,7 +696,13 @@
|
|||||||
"message": "Zaloguj się"
|
"message": "Zaloguj się"
|
||||||
},
|
},
|
||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Wybierz skórkę"
|
"message": "Wybór skórki"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Wyłącz"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Włącz"
|
||||||
},
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "Wersja Modrinth App v{version} została pobrana. Załaduj ponownie, żeby zaktualizować teraz, albo automatycznie, gdy zamkniesz Modrinth App."
|
"message": "Wersja Modrinth App v{version} została pobrana. Załaduj ponownie, żeby zaktualizować teraz, albo automatycznie, gdy zamkniesz Modrinth App."
|
||||||
@@ -683,6 +815,33 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Zaloguj się na konto Modrinth</link> by dodać znajomych i widzieć, w co grają!"
|
"message": "<link>Zaloguj się na konto Modrinth</link> by dodać znajomych i widzieć, w co grają!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Utwórz skrót"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Eksportuj paczkę modów"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Uruchom instancję"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "Więcej akcji"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Otwórz folder"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Napraw"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Ustawienia instancji"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Uruchamianie..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Zatrzymywanie..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Dodaj i graj"
|
"message": "Dodaj i graj"
|
||||||
},
|
},
|
||||||
@@ -725,6 +884,9 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Zapisz jako..."
|
"message": "Zapisz jako..."
|
||||||
},
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Nigdy nie grano"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Adres"
|
"message": "Adres"
|
||||||
},
|
},
|
||||||
@@ -870,7 +1032,7 @@
|
|||||||
"message": "Niestandardowe argumenty Java"
|
"message": "Niestandardowe argumenty Java"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.java.custom-java-installation": {
|
"instance.settings.tabs.java.custom-java-installation": {
|
||||||
"message": "Niestandardowa instalacja Javy"
|
"message": "Niestandardowa instalacja Java"
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||||
"message": "Niestandardowa alokacja pamięci"
|
"message": "Niestandardowa alokacja pamięci"
|
||||||
@@ -879,7 +1041,7 @@
|
|||||||
"message": "Zmienne środowiskowe..."
|
"message": "Zmienne środowiskowe..."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.java.enter-java-arguments": {
|
"instance.settings.tabs.java.enter-java-arguments": {
|
||||||
"message": "Argumenty Javy..."
|
"message": "Argumenty Java..."
|
||||||
},
|
},
|
||||||
"instance.settings.tabs.java.environment-variables": {
|
"instance.settings.tabs.java.environment-variables": {
|
||||||
"message": "Zmienne środowiskowe"
|
"message": "Zmienne środowiskowe"
|
||||||
@@ -929,6 +1091,12 @@
|
|||||||
"instance.settings.tabs.window.width.enter": {
|
"instance.settings.tabs.window.width.enter": {
|
||||||
"message": "Wprowadź szerokość..."
|
"message": "Wprowadź szerokość..."
|
||||||
},
|
},
|
||||||
|
"instance.shared-instance.publish-review.admonition-header": {
|
||||||
|
"message": "Opublikuj aktualizację graczom"
|
||||||
|
},
|
||||||
|
"instance.shared-instance.publish-review.publish-button": {
|
||||||
|
"message": "Opublikuj aktualizację"
|
||||||
|
},
|
||||||
"instance.worlds.a_minecraft_server": {
|
"instance.worlds.a_minecraft_server": {
|
||||||
"message": "Serwer Minecraft"
|
"message": "Serwer Minecraft"
|
||||||
},
|
},
|
||||||
@@ -992,6 +1160,27 @@
|
|||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Zaloguj się do Minecraft"
|
"message": "Zaloguj się do Minecraft"
|
||||||
},
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Potrzebujesz konto Microsoft, które posiada Minecraft, zanim będziesz mógł włączyć i zacząć grać."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Zaloguj się do konta Microsoft"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Nie masz konta?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Zdobądź Minecraft"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Zdobądź pomoc techniczną"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft wymagany"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Zaloguj się do Microsoft"
|
||||||
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Podane przez instancję"
|
"message": "Podane przez instancję"
|
||||||
},
|
},
|
||||||
@@ -1015,26 +1204,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "Loader jest dostarczony przez serwer"
|
"message": "Loader jest dostarczony przez serwer"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Plik jest sprawdzony tylko, jeżeli został przesłany na Modrinth, niezależnie od formatu (w tym pliki .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Nie pokazuj ponownie"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Potwierdź instalację"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Instaluj mimo to"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "Wirusy są często kryte w plikach paczek modów przesyłanych na platformach takich jak Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Nie mogliśmy znaleźć tego pliku na Modrinth. Stanowczo zalecamy instalowanie plików tylko ze źródeł, którym ufasz."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Ostrzeżenie o nieznanym pliku"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,12 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Ocultar mais instâncias em execução"
|
"message": "Ocultar mais instâncias em execução"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Copiado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Copiar detalhes"
|
||||||
|
},
|
||||||
"app.action-bar.install.dismiss": {
|
"app.action-bar.install.dismiss": {
|
||||||
"message": "Dispensar"
|
"message": "Dispensar"
|
||||||
},
|
},
|
||||||
@@ -20,6 +26,66 @@
|
|||||||
"app.action-bar.install.retry": {
|
"app.action-bar.install.retry": {
|
||||||
"message": "Tentar novamente"
|
"message": "Tentar novamente"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Cancelado devido ao aplicativo ter fechado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Não foi possível ler o pacote de mods"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Cancelado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "A limpeza não foi finalizada"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Não foi possível baixar os arquivos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "O arquivo baixado está corrompido"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Não foi possível salvar os arquivos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "A transferência não foi finalizada"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "Instância não encontrada"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "O caminho do arquivo é inválido"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Os dados do pacote de mods é inválido"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Os arquivos do pacote de mods possui metadados inválidos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "Configuração Java não foi finalizada"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "Falha na configuração do loader"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Não foi atualizar os dados locais"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "Falha na configuração do Minecraft"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Não foi possível alcançar o Modrinth"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Sem permissão para escrita"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Não foi possível baixar o pacote"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Algo deu errado"
|
||||||
|
},
|
||||||
"app.action-bar.install.unknown-instance": {
|
"app.action-bar.install.unknown-instance": {
|
||||||
"message": "Instância desconhecida"
|
"message": "Instância desconhecida"
|
||||||
},
|
},
|
||||||
@@ -59,6 +125,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Ver registros"
|
"message": "Ver registros"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Aceitar tudo"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Anúncios tornam o Modrinth possível e financiam os pagamentos dos criadores. Nossos parceiros talvez armazenem ou acessem os cookies no aplicativo para personalizar anúncios e medir o desempenho."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Gerenciar preferências"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Rejeitar tudo"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "Sua privacidade e como anúncios apoiam o Modrinth"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Ativa a renderização avançada, como desfoque que talvez afete o desempenho sem renderização acelerada do hardware."
|
"message": "Ativa a renderização avançada, como desfoque que talvez afete o desempenho sem renderização acelerada do hardware."
|
||||||
},
|
},
|
||||||
@@ -219,7 +300,7 @@
|
|||||||
"message": "Finalizando"
|
"message": "Finalizando"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_instance": {
|
"app.install.phase.preparing_instance": {
|
||||||
"message": "Preparando instância"
|
"message": "Na fila"
|
||||||
},
|
},
|
||||||
"app.install.phase.preparing_java": {
|
"app.install.phase.preparing_java": {
|
||||||
"message": "Preparando Java"
|
"message": "Preparando Java"
|
||||||
@@ -359,29 +440,35 @@
|
|||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Buscar {count} mundos..."
|
"message": "Buscar {count} mundos..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Conteúdo necessário"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Instale para jogar"
|
"message": "Instale para jogar"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Instalar mesmo assim"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Instalar"
|
"message": "Instalar"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Este convite foi criado por outro usuário do Modrinth, não pelo próprio Modrinth. Só aceite convites de pessoas que você confia."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, =0 {Nenhum mod} one {# mod} other {# mods}}"
|
"message": "{count, plural, =0 {Nenhum mod} one {# mod} other {# mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "Pacote de mods necessário"
|
"message": "Um arquivo só é revisado se for publicado no Modrinth, independente do formato de arquivo (incluindo .mrpack)."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Este servidor exige mods para jogar. Clique em instalar para configurar os arquivos necessários através do Modrinth, e então iniciar diretamente no servidor."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Instância compartilhada"
|
"message": "Instância compartilhada"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "Instância de servidor compartilhada"
|
"message": "Este pacote de mods do servidor contém arquivos não publicados no Modrinth. Recomendamos fortemente a instalar apenas arquivos de fontes que você confia."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Aviso de arquivos desconhecidos"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Arquivos não reconhecidos"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Ver conteúdo"
|
"message": "Ver conteúdo"
|
||||||
@@ -389,20 +476,29 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Atualize para jogar"
|
"message": "Atualize para jogar"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "Atualização necessária"
|
"message": "Removido"
|
||||||
},
|
|
||||||
"app.modal.update-to-play.update-required-description": {
|
|
||||||
"message": "Uma atualização é necessária para jogar {name}. Atualize para a versão mais recente para iniciar o jogo."
|
|
||||||
},
|
},
|
||||||
"app.project.install-button.already-installed": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Este projeto já foi instalado"
|
"message": "Este projeto já foi instalado"
|
||||||
},
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Trocar versão"
|
||||||
|
},
|
||||||
"app.project.install-context.back-to-browse": {
|
"app.project.install-context.back-to-browse": {
|
||||||
"message": "Voltar a descobrir"
|
"message": "Voltar a descobrir"
|
||||||
},
|
},
|
||||||
"app.project.install-context.install-content-to-instance": {
|
"app.project.version.all-versions": {
|
||||||
"message": "Instalar conteúdo para a instância"
|
"message": "Todas as versões"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Baixar no navegador"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Instalando"
|
||||||
|
},
|
||||||
|
"app.project.versions.already-installed": {
|
||||||
|
"message": "Já instalado"
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Modo desenvolvedor ativado."
|
"message": "Modo desenvolvedor ativado."
|
||||||
@@ -410,6 +506,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "Baixando v{version}"
|
"message": "Baixando v{version}"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Anúncios tornam o Modrinth possível e financiam os pagamentos dos criadores. Nossos parceiros talvez armazenem ou acessem os cookies no aplicativo para personalizar anúncios e medir o desempenho. Você pode recusar ou gerenciar suas preferências abaixo."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Aparência"
|
"message": "Aparência"
|
||||||
},
|
},
|
||||||
@@ -452,6 +551,9 @@
|
|||||||
"app.skins.dropped-file-error.title": {
|
"app.skins.dropped-file-error.title": {
|
||||||
"message": "Erro ao processar arquivo"
|
"message": "Erro ao processar arquivo"
|
||||||
},
|
},
|
||||||
|
"app.skins.ears-feature-notice": {
|
||||||
|
"message": "Esta skin usa recursos do mod {ears}"
|
||||||
|
},
|
||||||
"app.skins.edit-button": {
|
"app.skins.edit-button": {
|
||||||
"message": "Editar skin"
|
"message": "Editar skin"
|
||||||
},
|
},
|
||||||
@@ -524,6 +626,9 @@
|
|||||||
"app.skins.section.builders-and-biomes": {
|
"app.skins.section.builders-and-biomes": {
|
||||||
"message": "Construtores & Biomas"
|
"message": "Construtores & Biomas"
|
||||||
},
|
},
|
||||||
|
"app.skins.section.chaos-cubed": {
|
||||||
|
"message": "Chaos Cubed"
|
||||||
|
},
|
||||||
"app.skins.section.chase-the-skies": {
|
"app.skins.section.chase-the-skies": {
|
||||||
"message": "Chase the Skies"
|
"message": "Chase the Skies"
|
||||||
},
|
},
|
||||||
@@ -570,11 +675,17 @@
|
|||||||
"message": "Modrinth Bot animado"
|
"message": "Modrinth Bot animado"
|
||||||
},
|
},
|
||||||
"app.skins.sign-in.title": {
|
"app.skins.sign-in.title": {
|
||||||
"message": "Por favor, inicie sessão"
|
"message": "Inicie a sessão"
|
||||||
},
|
},
|
||||||
"app.skins.title": {
|
"app.skins.title": {
|
||||||
"message": "Seletor de skins"
|
"message": "Seletor de skins"
|
||||||
},
|
},
|
||||||
|
"app.skins.toggle-ears-features-off": {
|
||||||
|
"message": "Desativar"
|
||||||
|
},
|
||||||
|
"app.skins.toggle-ears-features-on": {
|
||||||
|
"message": "Ativar"
|
||||||
|
},
|
||||||
"app.update-popup.body.download-complete": {
|
"app.update-popup.body.download-complete": {
|
||||||
"message": "O Modrinth App v{version} já foi instalado. Recarregue para atualizar agora ou ela será feita automaticamente ao fechar o Modrinth App."
|
"message": "O Modrinth App v{version} já foi instalado. Recarregue para atualizar agora ou ela será feita automaticamente ao fechar o Modrinth App."
|
||||||
},
|
},
|
||||||
@@ -588,7 +699,7 @@
|
|||||||
"message": "Mudanças"
|
"message": "Mudanças"
|
||||||
},
|
},
|
||||||
"app.update-popup.download": {
|
"app.update-popup.download": {
|
||||||
"message": "Baixar ({size})"
|
"message": "Instalar ({size})"
|
||||||
},
|
},
|
||||||
"app.update-popup.download-complete": {
|
"app.update-popup.download-complete": {
|
||||||
"message": "Instalação concluída"
|
"message": "Instalação concluída"
|
||||||
@@ -686,6 +797,33 @@
|
|||||||
"friends.sign-in-to-add-friends": {
|
"friends.sign-in-to-add-friends": {
|
||||||
"message": "<link>Inicie uma sessão com o Modrinth</link> para adicionar amigos e ver o que eles estão jogando!"
|
"message": "<link>Inicie uma sessão com o Modrinth</link> para adicionar amigos e ver o que eles estão jogando!"
|
||||||
},
|
},
|
||||||
|
"instance.action.create-shortcut": {
|
||||||
|
"message": "Criar atalho"
|
||||||
|
},
|
||||||
|
"instance.action.export-modpack": {
|
||||||
|
"message": "Exportar pacote de mods"
|
||||||
|
},
|
||||||
|
"instance.action.launch-instance": {
|
||||||
|
"message": "Iniciar instância"
|
||||||
|
},
|
||||||
|
"instance.action.more-actions": {
|
||||||
|
"message": "Mais ações"
|
||||||
|
},
|
||||||
|
"instance.action.open-folder": {
|
||||||
|
"message": "Abrir pasta"
|
||||||
|
},
|
||||||
|
"instance.action.repair": {
|
||||||
|
"message": "Reparar"
|
||||||
|
},
|
||||||
|
"instance.action.settings": {
|
||||||
|
"message": "Configurações da instância"
|
||||||
|
},
|
||||||
|
"instance.action.starting": {
|
||||||
|
"message": "Iniciando..."
|
||||||
|
},
|
||||||
|
"instance.action.stopping": {
|
||||||
|
"message": "Interrompendo..."
|
||||||
|
},
|
||||||
"instance.add-server.add-and-play": {
|
"instance.add-server.add-and-play": {
|
||||||
"message": "Adicionar e jogar"
|
"message": "Adicionar e jogar"
|
||||||
},
|
},
|
||||||
@@ -728,6 +866,9 @@
|
|||||||
"instance.files.save-as": {
|
"instance.files.save-as": {
|
||||||
"message": "Salvar como..."
|
"message": "Salvar como..."
|
||||||
},
|
},
|
||||||
|
"instance.playtime.never-played": {
|
||||||
|
"message": "Nunca jogou"
|
||||||
|
},
|
||||||
"instance.server-modal.address": {
|
"instance.server-modal.address": {
|
||||||
"message": "Endereço"
|
"message": "Endereço"
|
||||||
},
|
},
|
||||||
@@ -993,7 +1134,28 @@
|
|||||||
"message": "Selecionar conta"
|
"message": "Selecionar conta"
|
||||||
},
|
},
|
||||||
"minecraft-account.sign-in": {
|
"minecraft-account.sign-in": {
|
||||||
"message": "Inicie sessão no Minecraft"
|
"message": "Iniciar sessão no Minecraft"
|
||||||
|
},
|
||||||
|
"minecraft-required.description": {
|
||||||
|
"message": "Você precisa de uma conta Microsoft que possui o Minecraft antes de iniciar e jogar."
|
||||||
|
},
|
||||||
|
"minecraft-required.description-header": {
|
||||||
|
"message": "Entrar em uma conta Microsoft"
|
||||||
|
},
|
||||||
|
"minecraft-required.dont-have-account": {
|
||||||
|
"message": "Não possui uma conta?"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-minecraft": {
|
||||||
|
"message": "Obter Minecraft"
|
||||||
|
},
|
||||||
|
"minecraft-required.get-support": {
|
||||||
|
"message": "Obter suporte"
|
||||||
|
},
|
||||||
|
"minecraft-required.header": {
|
||||||
|
"message": "Minecraft necessário"
|
||||||
|
},
|
||||||
|
"minecraft-required.sign-in": {
|
||||||
|
"message": "Entrar na Microsoft"
|
||||||
},
|
},
|
||||||
"search.filter.locked.instance": {
|
"search.filter.locked.instance": {
|
||||||
"message": "Fornecido pela instância"
|
"message": "Fornecido pela instância"
|
||||||
@@ -1018,26 +1180,5 @@
|
|||||||
},
|
},
|
||||||
"search.filter.locked.server-loader.title": {
|
"search.filter.locked.server-loader.title": {
|
||||||
"message": "O loader é fornecido pelo servidor"
|
"message": "O loader é fornecido pelo servidor"
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.body": {
|
|
||||||
"message": "Um arquivo só é revisado se for enviado no Modrinth, independente do formato do arquivo (incluindo .mrpack)."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.dont-show-again": {
|
|
||||||
"message": "Não exibir aviso novamente"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.header": {
|
|
||||||
"message": "Confirmar instalação"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.install-anyway": {
|
|
||||||
"message": "Instalar mesmo assim"
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.malware-statement": {
|
|
||||||
"message": "O malware é distribuído frequentemente através de arquivos de pacote de mods compartilhados em plataformas como Discord."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.body": {
|
|
||||||
"message": "Não encontramos este arquivo no Modrinth. Nós recomendamos fortemente instalar arquivos apenas de fontes confiáveis."
|
|
||||||
},
|
|
||||||
"unknown-pack-warning-modal.warning.title": {
|
|
||||||
"message": "Aviso de arquivo desconhecido"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,87 @@
|
|||||||
"app.action-bar.hide-more-running-instances": {
|
"app.action-bar.hide-more-running-instances": {
|
||||||
"message": "Esconder mais instâncias a correr"
|
"message": "Esconder mais instâncias a correr"
|
||||||
},
|
},
|
||||||
|
"app.action-bar.install.copied-details": {
|
||||||
|
"message": "Copiado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.copy-details": {
|
||||||
|
"message": "Copiar detalhes"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.dismiss": {
|
||||||
|
"message": "Dispensar"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.open-instance": {
|
||||||
|
"message": "Abrir instância"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.retry": {
|
||||||
|
"message": "Tentar novamente"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.app-closing": {
|
||||||
|
"message": "Cancelado devido ao encerramento da aplicação."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.bad-modpack-file": {
|
||||||
|
"message": "Não foi possível ler o Modpack"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.canceled": {
|
||||||
|
"message": "Cancelado"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.cleanup-incomplete": {
|
||||||
|
"message": "A limpeza não foi concluída."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.content-download-failed": {
|
||||||
|
"message": "Não foi possível descarregar os ficheiros."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.corrupt-download": {
|
||||||
|
"message": "O ficheiro descarregado está corrompido."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.could-not-save-files": {
|
||||||
|
"message": "Não foi possível guardar os ficheiros."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.download-failed": {
|
||||||
|
"message": "O download não pôde ser concluído."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.instance-not-found": {
|
||||||
|
"message": "Não foi possível encontrar a instância."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-file-path": {
|
||||||
|
"message": "Não foi possível encontrar a instância."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack": {
|
||||||
|
"message": "Dados do Modpack inválidos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.invalid-modpack-files": {
|
||||||
|
"message": "Os ficheiros do Modpack possuem metadata inválidos"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.java-setup-failed": {
|
||||||
|
"message": "C"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.loader-setup-failed": {
|
||||||
|
"message": "A configuração do loader falhou"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.local-data-error": {
|
||||||
|
"message": "Não foi possível atualizar os dados locais."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.minecraft-setup-failed": {
|
||||||
|
"message": "A instalação do Minecraft falhou"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.modrinth-unreachable": {
|
||||||
|
"message": "Não foi possível carregar o Modrinth."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.no-write-permission": {
|
||||||
|
"message": "Sem autorização para editar."
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.pack-download-failed": {
|
||||||
|
"message": "Não foi possível descarregar o pack"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.summary.unexpected-error": {
|
||||||
|
"message": "Algo correu mal"
|
||||||
|
},
|
||||||
|
"app.action-bar.install.unknown-instance": {
|
||||||
|
"message": "Instância desconhecida"
|
||||||
|
},
|
||||||
|
"app.action-bar.installs": {
|
||||||
|
"message": "Instalações"
|
||||||
|
},
|
||||||
"app.action-bar.make-primary-instance": {
|
"app.action-bar.make-primary-instance": {
|
||||||
"message": "Transformar na instância principal"
|
"message": "Transformar na instância principal"
|
||||||
},
|
},
|
||||||
@@ -44,6 +125,21 @@
|
|||||||
"app.action-bar.view-logs": {
|
"app.action-bar.view-logs": {
|
||||||
"message": "Ver logs"
|
"message": "Ver logs"
|
||||||
},
|
},
|
||||||
|
"app.ads-consent.accept": {
|
||||||
|
"message": "Aceitar tudo"
|
||||||
|
},
|
||||||
|
"app.ads-consent.body": {
|
||||||
|
"message": "Os anúncios tornam o Modrinth possível e financiam os pagamentos aos criadores. Os nossos parceiros podem armazenar ou aceder a cookies na aplicação para personalizar anúncios e medir o desempenho."
|
||||||
|
},
|
||||||
|
"app.ads-consent.manage": {
|
||||||
|
"message": "Gerir preferências"
|
||||||
|
},
|
||||||
|
"app.ads-consent.reject": {
|
||||||
|
"message": "Rejeitar tudo"
|
||||||
|
},
|
||||||
|
"app.ads-consent.title": {
|
||||||
|
"message": "A sua privacidade e como os anúncios são financiados pela Modrinth"
|
||||||
|
},
|
||||||
"app.appearance-settings.advanced-rendering.description": {
|
"app.appearance-settings.advanced-rendering.description": {
|
||||||
"message": "Ativa a renderização avançada, como efeitos de desfoque, que podem causar problemas de desempenho sem o uso de renderização acelerada por hardware."
|
"message": "Ativa a renderização avançada, como efeitos de desfoque, que podem causar problemas de desempenho sem o uso de renderização acelerada por hardware."
|
||||||
},
|
},
|
||||||
@@ -68,18 +164,69 @@
|
|||||||
"app.appearance-settings.default-landing-page.title": {
|
"app.appearance-settings.default-landing-page.title": {
|
||||||
"message": "Página de carregamento principal"
|
"message": "Página de carregamento principal"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.hide-nametag.description": {
|
||||||
|
"message": "Desativa o nametag acima do seu player na página de skins."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.hide-nametag.title": {
|
||||||
|
"message": "Ocultar nametag"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.jump-back-into-worlds.description": {
|
||||||
|
"message": "Inclui mundos recentes na secção \"Voltar à ação\" na página inicial."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||||
|
"message": "Volte aos mundos"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.minimize-launcher.description": {
|
||||||
|
"message": "Minimiza o inicializador quando um processo Minecraft é iniciado."
|
||||||
|
},
|
||||||
"app.appearance-settings.minimize-launcher.title": {
|
"app.appearance-settings.minimize-launcher.title": {
|
||||||
"message": "Minimizar launcher"
|
"message": "Minimizar launcher"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.native-decorations.description": {
|
||||||
|
"message": "Utilizar a moldura da janela do sistema (é necessário reiniciar a aplicação)."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.native-decorations.title": {
|
||||||
|
"message": "Decorações nativas"
|
||||||
|
},
|
||||||
"app.appearance-settings.select-option": {
|
"app.appearance-settings.select-option": {
|
||||||
"message": "Seleciona uma opção"
|
"message": "Seleciona uma opção"
|
||||||
},
|
},
|
||||||
|
"app.appearance-settings.show-play-time.description": {
|
||||||
|
"message": "Apresenta quanto tempo passou a jogar uma instância."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.show-play-time.title": {
|
||||||
|
"message": "Mostrar tempo de jogo"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.description": {
|
||||||
|
"message": "Ignora automaticamente confirmações de baixo risco, como instalações duplicadas de pacotes de mods, eliminação normal de conteúdo, atualizações em massa, desvinculação de pacotes de mods e pedidos de reparação. Os avisos de perigo ainda serão exibidos."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.skip-non-essential-warnings.title": {
|
||||||
|
"message": "Ignorar avisos não essenciais"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.toggle-sidebar.description": {
|
||||||
|
"message": "Permite ativar/desativar a barra lateral."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.toggle-sidebar.title": {
|
||||||
|
"message": "Ativar/desativar Barra lateral"
|
||||||
|
},
|
||||||
|
"app.appearance-settings.unknown-pack-warning.description": {
|
||||||
|
"message": "Se tentar instalar um ficheiro Modrinth Pack (.mrpack) que não esteja alojado no Modrinth, iremos garantir que compreende os riscos antes de o instalar."
|
||||||
|
},
|
||||||
|
"app.appearance-settings.unknown-pack-warning.title": {
|
||||||
|
"message": "Avise-me antes de instalar pacotes de mods desconhecidos."
|
||||||
|
},
|
||||||
"app.auth-servers.unreachable.body": {
|
"app.auth-servers.unreachable.body": {
|
||||||
"message": "Os servidores de autenticação do Minecraft poderão estar em baixo de momento. Verifica a tua ligação à internet e tenta novamente mais tarde."
|
"message": "Os servidores de autenticação do Minecraft poderão estar em baixo de momento. Verifica a tua ligação à internet e tenta novamente mais tarde."
|
||||||
},
|
},
|
||||||
"app.auth-servers.unreachable.header": {
|
"app.auth-servers.unreachable.header": {
|
||||||
"message": "Não foi possível alcançar os servidores de autenticação"
|
"message": "Não foi possível alcançar os servidores de autenticação"
|
||||||
},
|
},
|
||||||
|
"app.browse.add-servers-to-instance": {
|
||||||
|
"message": "Adicionar servidor à instância"
|
||||||
|
},
|
||||||
|
"app.browse.add-to-an-instance": {
|
||||||
|
"message": "Adicionar a uma instância"
|
||||||
|
},
|
||||||
"app.browse.add-to-instance": {
|
"app.browse.add-to-instance": {
|
||||||
"message": "Adicionar à instância"
|
"message": "Adicionar à instância"
|
||||||
},
|
},
|
||||||
@@ -92,15 +239,30 @@
|
|||||||
"app.browse.already-added": {
|
"app.browse.already-added": {
|
||||||
"message": "Já adicionado"
|
"message": "Já adicionado"
|
||||||
},
|
},
|
||||||
|
"app.browse.back-to-instance": {
|
||||||
|
"message": "Voltar à instância"
|
||||||
|
},
|
||||||
"app.browse.discover-content": {
|
"app.browse.discover-content": {
|
||||||
"message": "Descobrir conteúdo"
|
"message": "Descobrir conteúdo"
|
||||||
},
|
},
|
||||||
"app.browse.discover-servers": {
|
"app.browse.discover-servers": {
|
||||||
"message": "Descobrir servidores"
|
"message": "Descobrir servidores"
|
||||||
},
|
},
|
||||||
|
"app.browse.hide-added-servers": {
|
||||||
|
"message": "Ocultar servidores já adicionados"
|
||||||
|
},
|
||||||
"app.browse.project-type.modpacks": {
|
"app.browse.project-type.modpacks": {
|
||||||
"message": "Modpacks"
|
"message": "Modpacks"
|
||||||
},
|
},
|
||||||
|
"app.browse.server-instance-content-warning": {
|
||||||
|
"message": "Adicionar conteúdo pode quebrar a compatibilidade ao entrar no servidor. Qualquer conteúdo adicionado também será perdido ao atualizar o conteúdo da instância do servidor."
|
||||||
|
},
|
||||||
|
"app.browse.server.installing": {
|
||||||
|
"message": "Instalando.."
|
||||||
|
},
|
||||||
|
"app.content-install.no-compatible-versions": {
|
||||||
|
"message": "Nenhuma versão disponível corresponde a {compatibilityLabel}. Selecione uma versão para instalar mesmo assim. As dependências não serão instaladas automaticamente."
|
||||||
|
},
|
||||||
"app.export-modal.description-placeholder": {
|
"app.export-modal.description-placeholder": {
|
||||||
"message": "Insere a descrição do modpack..."
|
"message": "Insere a descrição do modpack..."
|
||||||
},
|
},
|
||||||
@@ -111,7 +273,7 @@
|
|||||||
"message": "Exportar modpack"
|
"message": "Exportar modpack"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-label": {
|
"app.export-modal.modpack-name-label": {
|
||||||
"message": "Nome do Modpack"
|
"message": "Nome do pacote"
|
||||||
},
|
},
|
||||||
"app.export-modal.modpack-name-placeholder": {
|
"app.export-modal.modpack-name-placeholder": {
|
||||||
"message": "Nome do Modpack"
|
"message": "Nome do Modpack"
|
||||||
@@ -122,6 +284,60 @@
|
|||||||
"app.export-modal.version-number-placeholder": {
|
"app.export-modal.version-number-placeholder": {
|
||||||
"message": "1.0.0"
|
"message": "1.0.0"
|
||||||
},
|
},
|
||||||
|
"app.install.phase.downloading_content": {
|
||||||
|
"message": "Baixando conteúdo"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_minecraft": {
|
||||||
|
"message": "Descarregar Minecraft"
|
||||||
|
},
|
||||||
|
"app.install.phase.downloading_pack_file": {
|
||||||
|
"message": "Descarregando o ficheiro "
|
||||||
|
},
|
||||||
|
"app.install.phase.extracting_overrides": {
|
||||||
|
"message": "Extraindo overrides"
|
||||||
|
},
|
||||||
|
"app.install.phase.finalizing": {
|
||||||
|
"message": "Finalizando"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_instance": {
|
||||||
|
"message": "Instalado na fila"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java": {
|
||||||
|
"message": "Preparando Java"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.downloading": {
|
||||||
|
"message": "Descarregar Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.extracting": {
|
||||||
|
"message": "Extrair Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.fetching-metadata": {
|
||||||
|
"message": "Obtenção de Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.resolving": {
|
||||||
|
"message": "Preparar Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.preparing_java.validating": {
|
||||||
|
"message": "Validando o Java {version}"
|
||||||
|
},
|
||||||
|
"app.install.phase.reading_pack_manifest": {
|
||||||
|
"message": "Lendo Manifesto"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_loader": {
|
||||||
|
"message": "Resolvendo o carregador"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_minecraft": {
|
||||||
|
"message": "Resolução de problemas no Minecraft"
|
||||||
|
},
|
||||||
|
"app.install.phase.resolving_pack": {
|
||||||
|
"message": "Resolvendo conteúdo"
|
||||||
|
},
|
||||||
|
"app.install.phase.rolling_back": {
|
||||||
|
"message": "Revertendo"
|
||||||
|
},
|
||||||
|
"app.install.phase.running_loader_processors": {
|
||||||
|
"message": "Executar processadores de carregamento"
|
||||||
|
},
|
||||||
"app.instance.confirm-delete.admonition-body": {
|
"app.instance.confirm-delete.admonition-body": {
|
||||||
"message": "Todos os dados da tua instância vão ser permanentemente apagados, incluídos os teus mundos, definições, e todos os conteúdos instalados."
|
"message": "Todos os dados da tua instância vão ser permanentemente apagados, incluídos os teus mundos, definições, e todos os conteúdos instalados."
|
||||||
},
|
},
|
||||||
@@ -146,6 +362,15 @@
|
|||||||
"app.instance.modpack-already-installed.instance": {
|
"app.instance.modpack-already-installed.instance": {
|
||||||
"message": "Instância"
|
"message": "Instância"
|
||||||
},
|
},
|
||||||
|
"app.instance.mods.bulk-update.downloading-projects": {
|
||||||
|
"message": "A descarregar projetos {current, number}/{total, number}..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.finishing": {
|
||||||
|
"message": "A terminar a atualização..."
|
||||||
|
},
|
||||||
|
"app.instance.mods.bulk-update.resolving-versions": {
|
||||||
|
"message": "Resolvendo versões..."
|
||||||
|
},
|
||||||
"app.instance.mods.content-type-project": {
|
"app.instance.mods.content-type-project": {
|
||||||
"message": "projeto"
|
"message": "projeto"
|
||||||
},
|
},
|
||||||
@@ -170,6 +395,18 @@
|
|||||||
"app.instance.worlds.browse-servers": {
|
"app.instance.worlds.browse-servers": {
|
||||||
"message": "Procurar servidores"
|
"message": "Procurar servidores"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.delete-button": {
|
||||||
|
"message": "Apagar mundo"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.title": {
|
||||||
|
"message": "Apagar mundo"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-body": {
|
||||||
|
"message": "Este mundo será permanentemente excluído desta instância. Esta ação não pode ser anulada."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.delete-world-modal.warning-header": {
|
||||||
|
"message": "A eliminar {name}"
|
||||||
|
},
|
||||||
"app.instance.worlds.filter-modded": {
|
"app.instance.worlds.filter-modded": {
|
||||||
"message": "Com Mods"
|
"message": "Com Mods"
|
||||||
},
|
},
|
||||||
@@ -188,32 +425,50 @@
|
|||||||
"app.instance.worlds.no-worlds-heading": {
|
"app.instance.worlds.no-worlds-heading": {
|
||||||
"message": "Sem servidores ou mundos adicionados"
|
"message": "Sem servidores ou mundos adicionados"
|
||||||
},
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.remove-button": {
|
||||||
|
"message": "Remover server"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.title": {
|
||||||
|
"message": "Remover server"
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-body": {
|
||||||
|
"message": "Este mundo será permanentemente excluído desta instância. Esta ação não pode ser anulada."
|
||||||
|
},
|
||||||
|
"app.instance.worlds.remove-server-modal.warning-header": {
|
||||||
|
"message": "Removendo {name}"
|
||||||
|
},
|
||||||
"app.instance.worlds.search-worlds-placeholder": {
|
"app.instance.worlds.search-worlds-placeholder": {
|
||||||
"message": "Pesquisar {count} mundos..."
|
"message": "Pesquisar {count} mundos..."
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.content-required": {
|
|
||||||
"message": "Conteúdo necessário"
|
|
||||||
},
|
|
||||||
"app.modal.install-to-play.header": {
|
"app.modal.install-to-play.header": {
|
||||||
"message": "Instala para jogar"
|
"message": "Instala para jogar"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.install-anyway": {
|
||||||
|
"message": "Instalar mesmo assim"
|
||||||
|
},
|
||||||
"app.modal.install-to-play.install-button": {
|
"app.modal.install-to-play.install-button": {
|
||||||
"message": "Instalar"
|
"message": "Instalar"
|
||||||
},
|
},
|
||||||
|
"app.modal.install-to-play.invite-warning": {
|
||||||
|
"message": "Este convite foi criado por outro utilizador do Modrinth, não pelo Modrinth. Aceite convites apenas de pessoas em quem confia."
|
||||||
|
},
|
||||||
"app.modal.install-to-play.mod-count": {
|
"app.modal.install-to-play.mod-count": {
|
||||||
"message": "{count, plural, one {mod} other {mods}}"
|
"message": "{count, plural, one {mod} other {mods}}"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.required-modpack": {
|
"app.modal.install-to-play.reviewed-files": {
|
||||||
"message": "Modpack requerido"
|
"message": "Um ficheiro só é analisado se for publicado no Modrinth, independentemente do seu formato (incluindo .mrpack)."
|
||||||
},
|
|
||||||
"app.modal.install-to-play.server-requires-mods": {
|
|
||||||
"message": "Este servidor requer mods para jogares. Clica Instalar para transferir os ficheiros necessários do Modrinth, e então entrar diretamente no servidor."
|
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-instance": {
|
"app.modal.install-to-play.shared-instance": {
|
||||||
"message": "Instância partilhada"
|
"message": "Instância partilhada"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.shared-server-instance": {
|
"app.modal.install-to-play.unknown-files-description": {
|
||||||
"message": "Instância de servidor partilhada"
|
"message": "Este pacote de mods para o servidor contém ficheiros que não estão publicados no Modrinth. Recomendamos vivamente que instale apenas ficheiros de fontes fidedignas."
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unknown-files-warning": {
|
||||||
|
"message": "Aviso de ficheiros desconhecidos"
|
||||||
|
},
|
||||||
|
"app.modal.install-to-play.unrecognized-files": {
|
||||||
|
"message": "Arquivos não reconhecidos"
|
||||||
},
|
},
|
||||||
"app.modal.install-to-play.view-contents": {
|
"app.modal.install-to-play.view-contents": {
|
||||||
"message": "Ver conteúdo"
|
"message": "Ver conteúdo"
|
||||||
@@ -221,11 +476,26 @@
|
|||||||
"app.modal.update-to-play.header": {
|
"app.modal.update-to-play.header": {
|
||||||
"message": "Atualiza para jogar"
|
"message": "Atualiza para jogar"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required": {
|
"app.modal.update-to-play.removed": {
|
||||||
"message": "Atualização necessária"
|
"message": "Removido"
|
||||||
},
|
},
|
||||||
"app.modal.update-to-play.update-required-description": {
|
"app.project.install-button.already-installed": {
|
||||||
"message": "Uma atualização é necessária para jogar {name}. Por favor atualiza para a versão mais recente para iniciar o jogo."
|
"message": "Este projeto já está instalado."
|
||||||
|
},
|
||||||
|
"app.project.install-button.switch-version": {
|
||||||
|
"message": "Mudar Versão"
|
||||||
|
},
|
||||||
|
"app.project.install-context.back-to-browse": {
|
||||||
|
"message": "De volta à descoberta"
|
||||||
|
},
|
||||||
|
"app.project.version.all-versions": {
|
||||||
|
"message": "Todas as versões"
|
||||||
|
},
|
||||||
|
"app.project.version.download-in-browser": {
|
||||||
|
"message": "Download no navegador"
|
||||||
|
},
|
||||||
|
"app.project.version.installing": {
|
||||||
|
"message": "Instalando.."
|
||||||
},
|
},
|
||||||
"app.settings.developer-mode-enabled": {
|
"app.settings.developer-mode-enabled": {
|
||||||
"message": "Modo de desenvolvedor ativado."
|
"message": "Modo de desenvolvedor ativado."
|
||||||
@@ -233,6 +503,9 @@
|
|||||||
"app.settings.downloading": {
|
"app.settings.downloading": {
|
||||||
"message": "A transferir v{version}"
|
"message": "A transferir v{version}"
|
||||||
},
|
},
|
||||||
|
"app.settings.privacy.ads-consent.intro": {
|
||||||
|
"message": "Os anúncios tornam o Modrinth possível e financiam os pagamentos aos criadores. Os nossos parceiros podem armazenar ou aceder a cookies na aplicação para personalizar anúncios e medir o desempenho."
|
||||||
|
},
|
||||||
"app.settings.tabs.appearance": {
|
"app.settings.tabs.appearance": {
|
||||||
"message": "Aparência"
|
"message": "Aparência"
|
||||||
},
|
},
|
||||||
@@ -251,12 +524,39 @@
|
|||||||
"app.settings.tabs.resource-management": {
|
"app.settings.tabs.resource-management": {
|
||||||
"message": "Gestão de recursos"
|
"message": "Gestão de recursos"
|
||||||
},
|
},
|
||||||
|
"app.skins.delete-button": {
|
||||||
|
"message": "Apagar skin"
|
||||||
|
},
|
||||||
|
"app.skins.delete-modal.description": {
|
||||||
|
"message": "Isto irá eliminar permanentemente esta coleção. Esta ação não pode ser desfeita."
|
||||||
|
},
|
||||||
"app.skins.delete-modal.title": {
|
"app.skins.delete-modal.title": {
|
||||||
"message": "Tens a certeza que queres apagar esta skin?"
|
"message": "Tens a certeza que queres apagar esta skin?"
|
||||||
},
|
},
|
||||||
"app.skins.dropped-file-error.text": {
|
"app.skins.dropped-file-error.text": {
|
||||||
"message": "Não foi possível ler o ficheiro largado."
|
"message": "Não foi possível ler o ficheiro largado."
|
||||||
},
|
},
|
||||||
|
"app.skins.edit-button": {
|
||||||
|
"message": "Editar skin"
|
||||||
|
},
|
||||||
|
"app.skins.modal.add-title": {
|
||||||
|
"message": "Adicionar uma skin"
|
||||||
|
},
|
||||||
|
"app.skins.modal.none-cape-option": {
|
||||||
|
"message": "Nada"
|
||||||
|
},
|
||||||
|
"app.skins.modal.saving-tooltip": {
|
||||||
|
"message": "A guardar..."
|
||||||
|
},
|
||||||
|
"app.skins.preview.edit-button": {
|
||||||
|
"message": "Editar skin"
|
||||||
|
},
|
||||||
|
"app.skins.previewing-badge": {
|
||||||
|
"message": "Pré-visualizar"
|
||||||
|
},
|
||||||
|
"app.skins.reorder-error.text": {
|
||||||
|
"message": "O seu pedido de skin não pôde ser guardado."
|
||||||
|
},
|
||||||
"app.skins.section.modrinth": {
|
"app.skins.section.modrinth": {
|
||||||
"message": "Modrinth"
|
"message": "Modrinth"
|
||||||
},
|
},
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user