mirror of
https://github.com/modrinth/code.git
synced 2026-08-03 06:35:53 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f8da58745 | ||
|
|
108ac8032c | ||
|
|
1271de47b5 |
@@ -22,5 +22,4 @@ Refer to the standards: @standards/frontend/CROSS_PLATFORM_PAGES.md and @standar
|
||||
- Move the page component into `packages/ui/src/layouts/wrapped/` matching the route structure.
|
||||
- Replace any platform-specific imports with shared utilities.
|
||||
- Import and render the wrapped page from both frontends as a simple component.
|
||||
- If the layout uses TanStack Query for initial route paint with `ReadyTransition` / `useReadyState`, each platform route shell must call `ensureQueryData` for those queries with matching keys and fetchers — see **Platform route shells: prefetch with `ensureQueryData`** in `standards/frontend/CROSS_PLATFORM_PAGES.md`.
|
||||
6. **Verify** the page renders correctly by checking for missing imports and that all DI contracts are satisfied.
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
---
|
||||
name: review-changelog
|
||||
description: Review the latest changelog entry in packages/blog/changelog.ts against the project's changelog style guide and flag bullets that need rewriting. Use when checking a freshly added changelog entry before opening a PR, or when the user asks to review/lint the latest changelog.
|
||||
argument-hint: [product?]
|
||||
---
|
||||
|
||||
Refer to the standard: @standards/maintaining/CHANGELOG.md
|
||||
|
||||
## Steps
|
||||
|
||||
1. **Locate the latest entry:**
|
||||
- Open `packages/blog/changelog.ts`.
|
||||
- The latest entries are at the top of the `VERSIONS` array.
|
||||
- If `$ARGUMENTS` specifies a product (`web`, `hosting`, `app`), review the most recent entry for that product. Otherwise, review the most recent entry overall, plus any sibling entries sharing the same `date` (coordinated releases ship together).
|
||||
|
||||
2. **Read the standard above** in full before reviewing. The bullet rules, section/verb agreement, and "Don't" list are the source of truth.
|
||||
|
||||
3. **Check the entry shell:**
|
||||
- `date` is a valid ISO 8601 timestamp.
|
||||
- `product` is one of `web`, `hosting`, `app`.
|
||||
- `version` is present for `app` entries and omitted for `web`/`hosting`.
|
||||
- Section headings use `## Added`, `## Changed`, `## Fixed`, `## Security` (or a featured-release linked heading). Flag legacy `## Improvements`.
|
||||
|
||||
4. **Review each bullet** against the standard. For each bullet, check:
|
||||
- Voice/tense matches the section heading.
|
||||
- Opening verb agrees with its section.
|
||||
- Describes observable behavior, not implementation.
|
||||
- Specific enough to identify the surface (names the tab/page/modal).
|
||||
- One sentence, ends with a period, sentence case.
|
||||
- Uses branded names (Modrinth App, Modrinth Hosting) correctly.
|
||||
- No filler ("issue with", "issue where", "various", "some"), no vague intensifiers, no apologies, no PR/commit references (unless crediting a third-party contributor with a linked GitHub profile).
|
||||
- Not a duplicate sub-fix of a bigger change already listed.
|
||||
|
||||
5. **Report findings** as a short list grouped by entry. For each problem bullet, show the original line and a suggested rewrite. If the entry is clean, say so explicitly. Do not edit the file unless the user asks - this skill is a review pass, not a rewrite pass.
|
||||
|
||||
6. **If the user then asks to apply fixes**, edit `packages/blog/changelog.ts` directly using the suggested rewrites. Preserve tab indentation and template literal formatting.
|
||||
@@ -60,70 +60,16 @@ jobs:
|
||||
const fs = require('fs');
|
||||
const version = process.env.VERSION.replace(/^v/, '');
|
||||
const src = fs.readFileSync('packages/blog/changelog.ts', 'utf8');
|
||||
|
||||
// Parse every entry in the VERSIONS array, preserving their order
|
||||
// (which is reverse chronological).
|
||||
const entryRe = /\{\s*date:\s*`([^`]+)`,\s*product:\s*'(\w+)',(?:\s*version:\s*[`']([^`']+)[`'],)?\s*body:\s*`([\s\S]*?)`,\s*\}/g;
|
||||
const entries = [];
|
||||
let match;
|
||||
while ((match = entryRe.exec(src)) !== null) {
|
||||
entries.push({
|
||||
date: match[1],
|
||||
product: match[2],
|
||||
version: match[3],
|
||||
body: match[4],
|
||||
});
|
||||
}
|
||||
|
||||
const currentIdx = entries.findIndex(
|
||||
(e) => e.product === 'app' && e.version === version,
|
||||
);
|
||||
if (currentIdx === -1) {
|
||||
const escaped = version.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
const re = new RegExp("product:\\s*'app',\\s*version:\\s*'" + escaped + "',\\s*body:\\s*`([\\s\\S]*?)`,\\s*\\}");
|
||||
const m = src.match(re);
|
||||
if (!m) {
|
||||
console.error(`No app changelog entry found for version ${version}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Find the surrounding app entries so we can scope hosting changes to
|
||||
// exactly what shipped between the previous app release and this one.
|
||||
// Entries are in reverse chronological order, so newer entries have
|
||||
// smaller indices than older entries.
|
||||
let newerAppIdx = -1;
|
||||
for (let i = currentIdx - 1; i >= 0; i--) {
|
||||
if (entries[i].product === 'app') {
|
||||
newerAppIdx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
let previousAppIdx = entries.length;
|
||||
for (let i = currentIdx + 1; i < entries.length; i++) {
|
||||
if (entries[i].product === 'app') {
|
||||
previousAppIdx = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const hostingEntries = [];
|
||||
for (let i = newerAppIdx + 1; i < previousAppIdx; i++) {
|
||||
if (entries[i].product === 'hosting') {
|
||||
hostingEntries.push(entries[i]);
|
||||
}
|
||||
}
|
||||
|
||||
let output = entries[currentIdx].body;
|
||||
if (hostingEntries.length > 0) {
|
||||
// Demote any top-level section headings inside hosting bodies so
|
||||
// they nest cleanly under the "Modrinth Hosting (included)" header.
|
||||
const demoteHeadings = (body) =>
|
||||
body.replace(/^(#{1,5})\s/gm, (_, hashes) => `${hashes}# `);
|
||||
const hostingBody = hostingEntries
|
||||
.map((e) => demoteHeadings(e.body))
|
||||
.join('\n\n');
|
||||
output += `\n\n---\n\n## Modrinth Hosting (included)\n\n${hostingBody}`;
|
||||
}
|
||||
|
||||
fs.writeFileSync('release-notes.md', output);
|
||||
fs.writeFileSync('release-notes.md', m[1]);
|
||||
console.log(`Extracted changelog for app ${version}:`);
|
||||
console.log(output);
|
||||
console.log(m[1]);
|
||||
EOF
|
||||
|
||||
- name: 🛠️ Generate version manifest
|
||||
|
||||
@@ -78,6 +78,3 @@ storybook-static
|
||||
|
||||
# frontend robots.txt
|
||||
apps/frontend/src/public/robots.txt
|
||||
|
||||
# Oh My Code
|
||||
.omc/
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
See [CLAUDE.md](./CLAUDE.md) for all project instructions and guidelines.
|
||||
@@ -35,7 +35,6 @@
|
||||
"fuse.js": "^6.6.2",
|
||||
"intl-messageformat": "^10.7.7",
|
||||
"ofetch": "^1.3.4",
|
||||
"overlayscrollbars": "^2.15.1",
|
||||
"pinia": "^3.0.0",
|
||||
"posthog-js": "^1.158.2",
|
||||
"three": "^0.172.0",
|
||||
|
||||
+115
-129
@@ -18,10 +18,13 @@ import {
|
||||
LibraryIcon,
|
||||
LogInIcon,
|
||||
LogOutIcon,
|
||||
MaximizeIcon,
|
||||
MinimizeIcon,
|
||||
NewspaperIcon,
|
||||
NotepadTextIcon,
|
||||
PlusIcon,
|
||||
RefreshCwIcon,
|
||||
RestoreIcon,
|
||||
RightArrowIcon,
|
||||
ServerStackIcon,
|
||||
SettingsIcon,
|
||||
@@ -32,13 +35,13 @@ import {
|
||||
import {
|
||||
Admonition,
|
||||
Avatar,
|
||||
Button,
|
||||
ButtonStyled,
|
||||
commonMessages,
|
||||
ContentInstallModal,
|
||||
CreationFlowModal,
|
||||
defineMessages,
|
||||
I18nDebugPanel,
|
||||
LoadingBar,
|
||||
NewsArticleCard,
|
||||
NotificationPanel,
|
||||
OverflowMenu,
|
||||
@@ -53,11 +56,10 @@ import {
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { formatBytes, renderString } from '@modrinth/utils'
|
||||
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import { getVersion } from '@tauri-apps/api/app'
|
||||
import { invoke } from '@tauri-apps/api/core'
|
||||
import { getCurrentWindow } from '@tauri-apps/api/window'
|
||||
import { fetch as tauriFetch } from '@tauri-apps/plugin-http'
|
||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||
import { type } from '@tauri-apps/plugin-os'
|
||||
import { saveWindowState, StateFlags } from '@tauri-apps/plugin-window-state'
|
||||
@@ -66,6 +68,7 @@ import { computed, onMounted, onUnmounted, provide, ref, watch } from 'vue'
|
||||
import { RouterView, useRoute, useRouter } from 'vue-router'
|
||||
|
||||
import ModrinthAppLogo from '@/assets/modrinth_app.svg?component'
|
||||
import ModrinthLoadingIndicator from '@/components/LoadingIndicatorBar.vue'
|
||||
import AccountsCard from '@/components/ui/AccountsCard.vue'
|
||||
import Breadcrumbs from '@/components/ui/Breadcrumbs.vue'
|
||||
import ErrorModal from '@/components/ui/ErrorModal.vue'
|
||||
@@ -83,7 +86,6 @@ import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
|
||||
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
|
||||
import RunningAppBar from '@/components/ui/RunningAppBar.vue'
|
||||
import SplashScreen from '@/components/ui/SplashScreen.vue'
|
||||
import WindowControls from '@/components/ui/WindowControls.vue'
|
||||
import { useCheckDisableMouseover } from '@/composables/macCssFix.js'
|
||||
import { config } from '@/config'
|
||||
import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads.js'
|
||||
@@ -113,9 +115,8 @@ import {
|
||||
import { createServerInstall, provideServerInstall } from '@/providers/server-install'
|
||||
import { setupProviders } from '@/providers/setup'
|
||||
import { setupAuthProvider } from '@/providers/setup/auth'
|
||||
import { setupLoadingStateProvider } from '@/providers/setup/loading-state'
|
||||
import { useError } from '@/store/error.js'
|
||||
import { useTheming } from '@/store/state'
|
||||
import { useLoading, useTheming } from '@/store/state'
|
||||
|
||||
import { generateSkinPreviews } from './helpers/rendering/batch-skin-renderer'
|
||||
import { get_available_capes, get_available_skins } from './helpers/skins'
|
||||
@@ -421,25 +422,15 @@ const handleClose = async () => {
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
|
||||
const loading = setupLoadingStateProvider()
|
||||
const loading = useLoading()
|
||||
loading.setEnabled(false)
|
||||
let initialLoadToken = loading.begin()
|
||||
let routerToken = null
|
||||
let suspenseToken = null
|
||||
loading.startLoading()
|
||||
|
||||
let suspensePending = false
|
||||
|
||||
const sidebarOverlayScrollbarsOptions = Object.freeze({
|
||||
overflow: {
|
||||
x: 'hidden',
|
||||
y: 'scroll',
|
||||
},
|
||||
})
|
||||
|
||||
router.beforeEach(() => {
|
||||
suspensePending = false
|
||||
if (routerToken) loading.end(routerToken)
|
||||
routerToken = loading.begin()
|
||||
loading.startLoading()
|
||||
})
|
||||
router.afterEach((to, from, failure) => {
|
||||
trackEvent('PageView', {
|
||||
@@ -448,84 +439,12 @@ router.afterEach((to, from, failure) => {
|
||||
failed: failure,
|
||||
})
|
||||
setTimeout(() => {
|
||||
if (!suspensePending && stateInitialized.value) {
|
||||
if (initialLoadToken) {
|
||||
loading.end(initialLoadToken)
|
||||
initialLoadToken = null
|
||||
}
|
||||
if (routerToken) {
|
||||
loading.end(routerToken)
|
||||
routerToken = null
|
||||
}
|
||||
if (!suspensePending) {
|
||||
loading.stopLoading()
|
||||
}
|
||||
}, 100)
|
||||
})
|
||||
|
||||
function onSuspensePending() {
|
||||
suspensePending = true
|
||||
if (suspenseToken) loading.end(suspenseToken)
|
||||
suspenseToken = loading.begin()
|
||||
}
|
||||
|
||||
function onSuspenseResolve() {
|
||||
if (suspenseToken) {
|
||||
loading.end(suspenseToken)
|
||||
suspenseToken = null
|
||||
}
|
||||
if (routerToken) {
|
||||
loading.end(routerToken)
|
||||
routerToken = null
|
||||
}
|
||||
}
|
||||
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
watch(stateInitialized, (ready) => {
|
||||
if (ready) {
|
||||
if (initialLoadToken) {
|
||||
loading.end(initialLoadToken)
|
||||
initialLoadToken = null
|
||||
}
|
||||
if (routerToken) {
|
||||
loading.end(routerToken)
|
||||
routerToken = null
|
||||
}
|
||||
|
||||
queryClient.prefetchQuery({
|
||||
queryKey: ['servers'],
|
||||
queryFn: async () => {
|
||||
const response = await tauriApiClient.archon.servers_v0.list({ limit: 100 })
|
||||
const hasMedalServers = response.servers.some((s) => s.is_medal)
|
||||
if (hasMedalServers) {
|
||||
const subscriptions = await tauriApiClient.labrinth.billing_internal.getSubscriptions()
|
||||
for (const server of response.servers) {
|
||||
if (server.is_medal) {
|
||||
const sub = subscriptions.find((s) => s.metadata?.id === server.server_id)
|
||||
if (sub) {
|
||||
server.medal_expires = new Date(
|
||||
new Date(sub.created).getTime() + 5 * 86400000,
|
||||
).toISOString()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return response
|
||||
},
|
||||
staleTime: 30_000,
|
||||
})
|
||||
queryClient.prefetchQuery({
|
||||
queryKey: ['billing', 'subscriptions'],
|
||||
queryFn: () => tauriApiClient.labrinth.billing_internal.getSubscriptions(),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
queryClient.prefetchQuery({
|
||||
queryKey: ['billing', 'payments'],
|
||||
queryFn: () => tauriApiClient.labrinth.billing_internal.getPayments(),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
}
|
||||
})
|
||||
|
||||
const error = useError()
|
||||
const errorModal = ref()
|
||||
const minecraftAuthErrorModal = ref()
|
||||
@@ -578,27 +497,9 @@ setupAuthProvider(credentials, async (_redirectPath) => {
|
||||
await signIn()
|
||||
})
|
||||
|
||||
async function validateSession(sessionToken) {
|
||||
try {
|
||||
const response = await tauriFetch(`${config.labrinthBaseUrl}/v2/user`, {
|
||||
method: 'GET',
|
||||
headers: { Authorization: sessionToken },
|
||||
})
|
||||
if (response.status === 401) return false
|
||||
return true
|
||||
} catch {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchCredentials() {
|
||||
const creds = await getCreds().catch(handleError)
|
||||
if (creds && creds.user_id) {
|
||||
if (creds.session && !(await validateSession(creds.session))) {
|
||||
await logout().catch(handleError)
|
||||
credentials.value = null
|
||||
return
|
||||
}
|
||||
creds.user = await get_user(creds.user_id, 'bypass').catch(handleError)
|
||||
}
|
||||
credentials.value = creds ?? null
|
||||
@@ -1072,7 +973,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<WindowControls />
|
||||
<SplashScreen v-if="!stateFailed" ref="splashScreen" data-tauri-drag-region />
|
||||
<div id="teleports"></div>
|
||||
<div
|
||||
@@ -1270,6 +1170,22 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
<RunningAppBar />
|
||||
</Suspense>
|
||||
</div>
|
||||
<section v-if="!nativeDecorations" class="window-controls" data-tauri-drag-region-exclude>
|
||||
<Button class="titlebar-button" icon-only @click="() => getCurrentWindow().minimize()">
|
||||
<MinimizeIcon />
|
||||
</Button>
|
||||
<Button
|
||||
class="titlebar-button"
|
||||
icon-only
|
||||
@click="() => getCurrentWindow().toggleMaximize()"
|
||||
>
|
||||
<RestoreIcon v-if="isMaximized" />
|
||||
<MaximizeIcon v-else />
|
||||
</Button>
|
||||
<Button class="titlebar-button close" icon-only @click="handleClose">
|
||||
<XIcon />
|
||||
</Button>
|
||||
</section>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1312,7 +1228,7 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
width: 'calc(100% - var(--left-bar-width) - var(--right-bar-width))',
|
||||
}"
|
||||
>
|
||||
<LoadingBar position="absolute" />
|
||||
<ModrinthLoadingIndicator />
|
||||
</div>
|
||||
<div
|
||||
v-if="themeStore.featureFlags.page_path"
|
||||
@@ -1348,36 +1264,44 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
</Admonition>
|
||||
<RouterView v-slot="{ Component }">
|
||||
<template v-if="Component">
|
||||
<Suspense @pending="onSuspensePending" @resolve="onSuspenseResolve">
|
||||
<Suspense
|
||||
@pending="
|
||||
() => {
|
||||
suspensePending = true
|
||||
loading.startLoading()
|
||||
}
|
||||
"
|
||||
@resolve="loading.stopLoading()"
|
||||
>
|
||||
<component :is="Component"></component>
|
||||
</Suspense>
|
||||
</template>
|
||||
</RouterView>
|
||||
</div>
|
||||
<div
|
||||
class="app-sidebar mt-px shrink-0 flex flex-col border-0 border-l-[1px] border-[--brand-gradient-border] border-solid"
|
||||
class="app-sidebar mt-px shrink-0 flex flex-col border-0 border-l-[1px] border-[--brand-gradient-border] border-solid overflow-auto"
|
||||
:class="{ 'has-plus': hasPlus }"
|
||||
>
|
||||
<div
|
||||
v-overlay-scrollbars="sidebarOverlayScrollbarsOptions"
|
||||
class="app-sidebar-scrollable flex-grow shrink relative"
|
||||
class="app-sidebar-scrollable flex-grow shrink overflow-y-auto relative"
|
||||
:class="{ 'pb-12': !hasPlus }"
|
||||
data-overlayscrollbars-initialize
|
||||
>
|
||||
<div id="sidebar-teleport-target" class="sidebar-teleport-content"></div>
|
||||
<div class="sidebar-default-content" :class="{ 'sidebar-enabled': sidebarVisible }">
|
||||
<div class="p-4 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid">
|
||||
<div
|
||||
class="p-4 pr-1 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid"
|
||||
>
|
||||
<h3 class="text-base text-primary font-medium m-0">Playing as</h3>
|
||||
<suspense>
|
||||
<AccountsCard ref="accounts" mode="small" />
|
||||
</suspense>
|
||||
</div>
|
||||
<div class="p-4 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid">
|
||||
<div class="py-4 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid">
|
||||
<suspense>
|
||||
<FriendsList :credentials="credentials" :sign-in="() => signIn()" />
|
||||
</suspense>
|
||||
</div>
|
||||
<div v-if="news && news.length > 0" class="p-4 flex flex-col items-center">
|
||||
<div v-if="news && news.length > 0" class="p-4 pr-1 flex flex-col items-center">
|
||||
<h3 class="text-base mb-4 text-primary font-medium m-0 text-left w-full">News</h3>
|
||||
<div class="space-y-4 flex flex-col items-center w-full">
|
||||
<NewsArticleCard
|
||||
@@ -1444,6 +1368,72 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.window-controls {
|
||||
z-index: 20;
|
||||
display: none;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
|
||||
.titlebar-button {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
transition: all ease-in-out 0.1s;
|
||||
background-color: transparent;
|
||||
color: var(--color-base);
|
||||
height: 100%;
|
||||
width: 3rem;
|
||||
position: relative;
|
||||
box-shadow: none;
|
||||
|
||||
&:last-child {
|
||||
padding-right: 0.75rem;
|
||||
width: 3.75rem;
|
||||
}
|
||||
|
||||
svg {
|
||||
width: 1.25rem;
|
||||
height: 1.25rem;
|
||||
}
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
border-radius: 999999px;
|
||||
width: 3rem;
|
||||
height: 3rem;
|
||||
aspect-ratio: 1 / 1;
|
||||
margin-block: auto;
|
||||
position: absolute;
|
||||
background-color: transparent;
|
||||
scale: 0.9;
|
||||
transition: all ease-in-out 0.2s;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
&.close {
|
||||
&:hover,
|
||||
&:active {
|
||||
color: var(--color-accent-contrast);
|
||||
|
||||
&::before {
|
||||
background-color: var(--color-red);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:hover,
|
||||
&:active {
|
||||
color: var(--color-contrast);
|
||||
|
||||
&::before {
|
||||
background-color: var(--color-button-bg);
|
||||
scale: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.app-grid-layout,
|
||||
.app-contents {
|
||||
--top-bar-height: 3rem;
|
||||
@@ -1468,7 +1458,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
|
||||
.app-grid-statusbar {
|
||||
grid-area: status;
|
||||
padding-right: var(--window-controls-width, 0px);
|
||||
}
|
||||
|
||||
[data-tauri-drag-region-exclude] {
|
||||
@@ -1660,13 +1649,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
}
|
||||
</style>
|
||||
<style>
|
||||
.os-theme-dark,
|
||||
.os-theme-light {
|
||||
--os-handle-bg: var(--color-scrollbar) !important;
|
||||
--os-handle-bg-hover: var(--color-scrollbar) !important;
|
||||
--os-handle-bg-active: var(--color-scrollbar) !important;
|
||||
}
|
||||
|
||||
.mac {
|
||||
.app-grid-statusbar {
|
||||
padding-left: 5rem;
|
||||
@@ -1678,6 +1660,10 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
height: 2.5rem !important;
|
||||
}
|
||||
|
||||
.window-controls {
|
||||
display: flex !important;
|
||||
}
|
||||
|
||||
.info-card {
|
||||
right: 22rem;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ import {
|
||||
TrashIcon,
|
||||
} from '@modrinth/assets'
|
||||
import {
|
||||
Accordion,
|
||||
DropdownSelect,
|
||||
formatLoader,
|
||||
injectNotificationManager,
|
||||
@@ -134,33 +133,12 @@ const state = useStorage(
|
||||
{
|
||||
group: 'Group',
|
||||
sortBy: 'Name',
|
||||
collapsedGroups: [],
|
||||
},
|
||||
localStorage,
|
||||
{ mergeDefaults: true },
|
||||
)
|
||||
|
||||
const search = ref('')
|
||||
const collapsedSectionKeys = computed(() => new Set(state.value.collapsedGroups ?? []))
|
||||
|
||||
const getSectionKey = (sectionName) => `${state.value.group}:${sectionName}`
|
||||
|
||||
const isSectionCollapsed = (sectionName) => {
|
||||
return collapsedSectionKeys.value.has(getSectionKey(sectionName))
|
||||
}
|
||||
|
||||
const setSectionCollapsed = (sectionName, collapsed) => {
|
||||
const sectionKey = getSectionKey(sectionName)
|
||||
const collapsedSections = new Set(state.value.collapsedGroups ?? [])
|
||||
|
||||
if (collapsed) {
|
||||
collapsedSections.add(sectionKey)
|
||||
} else {
|
||||
collapsedSections.delete(sectionKey)
|
||||
}
|
||||
|
||||
state.value.collapsedGroups = [...collapsedSections]
|
||||
}
|
||||
|
||||
const filteredResults = computed(() => {
|
||||
const { group = 'Group', sortBy = 'Name' } = state.value
|
||||
@@ -302,21 +280,18 @@ const filteredResults = computed(() => {
|
||||
<span class="font-semibold text-secondary">{{ selected }}</span>
|
||||
</DropdownSelect>
|
||||
</div>
|
||||
<Accordion
|
||||
<div
|
||||
v-for="instanceSection in Array.from(filteredResults, ([key, value]) => ({
|
||||
key,
|
||||
value,
|
||||
}))"
|
||||
:key="instanceSection.key"
|
||||
:divider="instanceSection.key !== 'None'"
|
||||
:open-by-default="!isSectionCollapsed(instanceSection.key)"
|
||||
class="row"
|
||||
@on-open="setSectionCollapsed(instanceSection.key, false)"
|
||||
@on-close="setSectionCollapsed(instanceSection.key, true)"
|
||||
>
|
||||
<template v-if="instanceSection.key !== 'None'" #title>
|
||||
<span class="text-base">{{ instanceSection.key }}</span>
|
||||
</template>
|
||||
<div v-if="instanceSection.key !== 'None'" class="divider">
|
||||
<p>{{ instanceSection.key }}</p>
|
||||
<hr aria-hidden="true" />
|
||||
</div>
|
||||
<section class="instances">
|
||||
<Instance
|
||||
v-for="instance in instanceSection.value"
|
||||
@@ -326,7 +301,7 @@ const filteredResults = computed(() => {
|
||||
@contextmenu.prevent.stop="(event) => handleRightClick(event, instance.path)"
|
||||
/>
|
||||
</section>
|
||||
</Accordion>
|
||||
</div>
|
||||
<ConfirmDeleteInstanceModal ref="confirmModal" @delete="deleteProfile" />
|
||||
<ContextMenu ref="instanceOptions" @option-clicked="handleOptionsClick">
|
||||
<template #play> <PlayIcon /> Play </template>
|
||||
@@ -341,7 +316,73 @@ const filteredResults = computed(() => {
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
width: 100%;
|
||||
|
||||
.divider {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
gap: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
font-size: 1rem;
|
||||
white-space: nowrap;
|
||||
color: var(--color-contrast);
|
||||
}
|
||||
|
||||
hr {
|
||||
background-color: var(--color-gray);
|
||||
height: 1px;
|
||||
width: 100%;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
gap: 1rem;
|
||||
align-items: inherit;
|
||||
margin: 1rem 1rem 0 !important;
|
||||
padding: 1rem;
|
||||
width: calc(100% - 2rem);
|
||||
|
||||
.iconified-input {
|
||||
flex-grow: 1;
|
||||
|
||||
input {
|
||||
min-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.sort-dropdown {
|
||||
width: 10rem;
|
||||
}
|
||||
|
||||
.filter-dropdown {
|
||||
width: 15rem;
|
||||
}
|
||||
|
||||
.group-dropdown {
|
||||
width: 10rem;
|
||||
}
|
||||
|
||||
.labeled_button {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.instances {
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
<script setup>
|
||||
import { computed, onBeforeUnmount, ref, watch } from 'vue'
|
||||
|
||||
import { useLoading } from '@/store/state.js'
|
||||
|
||||
const props = defineProps({
|
||||
throttle: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
duration: {
|
||||
type: Number,
|
||||
default: 1000,
|
||||
},
|
||||
height: {
|
||||
type: Number,
|
||||
default: 2,
|
||||
},
|
||||
color: {
|
||||
type: String,
|
||||
default: 'var(--loading-bar-gradient)',
|
||||
},
|
||||
})
|
||||
|
||||
const indicator = useLoadingIndicator({
|
||||
duration: props.duration,
|
||||
throttle: props.throttle,
|
||||
})
|
||||
|
||||
onBeforeUnmount(() => indicator.clear)
|
||||
|
||||
const loading = useLoading()
|
||||
|
||||
watch(loading, (newValue) => {
|
||||
if (newValue.barEnabled) {
|
||||
if (newValue.loading) {
|
||||
indicator.start()
|
||||
} else {
|
||||
indicator.finish()
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function useLoadingIndicator(opts) {
|
||||
const progress = ref(0)
|
||||
const isLoading = ref(false)
|
||||
const step = computed(() => 10000 / opts.duration)
|
||||
|
||||
let _timer = null
|
||||
let _throttle = null
|
||||
|
||||
function start() {
|
||||
clear()
|
||||
progress.value = 0
|
||||
if (opts.throttle) {
|
||||
_throttle = setTimeout(() => {
|
||||
isLoading.value = true
|
||||
_startTimer()
|
||||
}, opts.throttle)
|
||||
} else {
|
||||
isLoading.value = true
|
||||
_startTimer()
|
||||
}
|
||||
}
|
||||
|
||||
function finish() {
|
||||
progress.value = 100
|
||||
_hide()
|
||||
}
|
||||
|
||||
function clear() {
|
||||
clearInterval(_timer)
|
||||
clearTimeout(_throttle)
|
||||
_timer = null
|
||||
_throttle = null
|
||||
}
|
||||
|
||||
function _increase(num) {
|
||||
progress.value = Math.min(100, progress.value + num)
|
||||
}
|
||||
|
||||
function _hide() {
|
||||
clear()
|
||||
setTimeout(() => {
|
||||
isLoading.value = false
|
||||
setTimeout(() => {
|
||||
progress.value = 0
|
||||
}, 400)
|
||||
}, 500)
|
||||
}
|
||||
|
||||
function _startTimer() {
|
||||
_timer = setInterval(() => {
|
||||
_increase(step.value)
|
||||
}, 100)
|
||||
}
|
||||
|
||||
return { progress, isLoading, start, finish, clear }
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div
|
||||
class="loading-indicator-bar"
|
||||
:style="{
|
||||
'--_width': `${indicator.progress.value}%`,
|
||||
'--_height': `${indicator.isLoading.value ? props.height : 0}px`,
|
||||
'--_opacity': `${indicator.isLoading.value ? 1 : 0}`,
|
||||
top: `0`,
|
||||
right: `0`,
|
||||
left: `${props.offsetWidth}`,
|
||||
pointerEvents: 'none',
|
||||
width: `var(--_width)`,
|
||||
height: `var(--_height)`,
|
||||
borderRadius: `var(--_height)`,
|
||||
// opacity: `var(--_opacity)`,
|
||||
background: `${props.color}`,
|
||||
backgroundSize: `${(100 / indicator.progress.value) * 100}% auto`,
|
||||
transition: 'width 0.1s ease-in-out, height 0.1s ease-out',
|
||||
zIndex: 6,
|
||||
}"
|
||||
>
|
||||
<slot />
|
||||
</div>
|
||||
</template>
|
||||
<style lang="scss" scoped>
|
||||
.loading-indicator-bar::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: var(--_width);
|
||||
bottom: 0;
|
||||
background-image: radial-gradient(80% 100% at 20% 0%, var(--color-brand) 0%, transparent 80%);
|
||||
opacity: calc(var(--_opacity) * 0.1);
|
||||
z-index: 5;
|
||||
transition:
|
||||
width 0.1s ease-in-out,
|
||||
opacity 0.1s ease-out;
|
||||
}
|
||||
</style>
|
||||
File diff suppressed because one or more lines are too long
@@ -1,98 +0,0 @@
|
||||
<template>
|
||||
<section v-if="showControls" class="window-controls" data-tauri-drag-region-exclude>
|
||||
<ButtonStyled type="transparent" circular>
|
||||
<button class="titlebar-button" @click="() => getCurrentWindow().minimize()">
|
||||
<MinimizeIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled type="transparent" circular>
|
||||
<button class="titlebar-button" @click="() => getCurrentWindow().toggleMaximize()">
|
||||
<RestoreIcon v-if="isMaximized" />
|
||||
<MaximizeIcon v-else />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled type="transparent" circular>
|
||||
<button class="titlebar-button close" @click="handleClose">
|
||||
<XIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { MaximizeIcon, MinimizeIcon, RestoreIcon, XIcon } from '@modrinth/assets'
|
||||
import { ButtonStyled } from '@modrinth/ui'
|
||||
import { getCurrentWindow } from '@tauri-apps/api/window'
|
||||
import { saveWindowState, StateFlags } from '@tauri-apps/plugin-window-state'
|
||||
import { computed, onMounted, onUnmounted, ref, watch } from 'vue'
|
||||
|
||||
import { get as getSettings } from '@/helpers/settings.ts'
|
||||
import { getOS } from '@/helpers/utils.js'
|
||||
|
||||
const WINDOW_CONTROLS_WIDTH = '8rem'
|
||||
|
||||
const nativeDecorations = ref(true)
|
||||
const isMaximized = ref(false)
|
||||
const os = ref('')
|
||||
|
||||
const showControls = computed(() => !nativeDecorations.value && os.value !== 'MacOS')
|
||||
watch(
|
||||
showControls,
|
||||
(visible) => {
|
||||
if (typeof document === 'undefined') return
|
||||
if (visible) {
|
||||
document.documentElement.style.setProperty('--window-controls-width', WINDOW_CONTROLS_WIDTH)
|
||||
} else {
|
||||
document.documentElement.style.removeProperty('--window-controls-width')
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
onMounted(async () => {
|
||||
os.value = await getOS()
|
||||
|
||||
const settings = await getSettings()
|
||||
nativeDecorations.value = settings.native_decorations
|
||||
|
||||
if (os.value !== 'MacOS') {
|
||||
await getCurrentWindow().setDecorations(nativeDecorations.value)
|
||||
}
|
||||
|
||||
isMaximized.value = await getCurrentWindow().isMaximized()
|
||||
|
||||
const unlisten = await getCurrentWindow().onResized(async () => {
|
||||
isMaximized.value = await getCurrentWindow().isMaximized()
|
||||
})
|
||||
|
||||
onUnmounted(() => {
|
||||
unlisten()
|
||||
document.documentElement.style.removeProperty('--window-controls-width')
|
||||
})
|
||||
})
|
||||
|
||||
const handleClose = async () => {
|
||||
await saveWindowState(StateFlags.ALL)
|
||||
await getCurrentWindow().close()
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.window-controls {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: 0;
|
||||
z-index: 10001;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
height: var(--top-bar-height, 3rem);
|
||||
padding-right: 0.5rem;
|
||||
gap: 0.25rem;
|
||||
|
||||
.titlebar-button.close:hover {
|
||||
background-color: var(--color-red);
|
||||
color: var(--color-accent-contrast);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -288,7 +288,7 @@ const messages = defineMessages({
|
||||
</div>
|
||||
</div>
|
||||
</ModalWrapper>
|
||||
<div v-if="userCredentials && !loading" class="flex gap-1 items-center mb-3 -ml-1">
|
||||
<div v-if="userCredentials && !loading" class="flex gap-1 items-center mb-3 ml-2 mr-1">
|
||||
<template v-if="sortedFriends.length > 0">
|
||||
<ButtonStyled circular type="transparent">
|
||||
<button
|
||||
@@ -309,7 +309,7 @@ const messages = defineMessages({
|
||||
@keyup.esc="search = ''"
|
||||
/>
|
||||
</template>
|
||||
<h3 v-else class="w-full text-base text-primary font-medium m-0">
|
||||
<h3 v-else class="ml-2 w-full text-base text-primary font-medium m-0">
|
||||
{{ formatMessage(messages.friends) }}
|
||||
</h3>
|
||||
<ButtonStyled v-if="incomingRequests.length > 0" circular type="transparent">
|
||||
@@ -331,11 +331,11 @@ const messages = defineMessages({
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
<div class="flex flex-col gap-3">
|
||||
<h3 v-if="loading" class="text-base text-primary font-medium m-0">
|
||||
<h3 v-if="loading" class="ml-4 mr-1 text-base text-primary font-medium m-0">
|
||||
{{ formatMessage(messages.friends) }}
|
||||
</h3>
|
||||
<template v-if="loading">
|
||||
<div v-for="n in 5" :key="n" class="flex gap-2 items-center animate-pulse">
|
||||
<div v-for="n in 5" :key="n" class="flex gap-2 items-center animate-pulse ml-4 mr-1">
|
||||
<div class="min-w-9 min-h-9 bg-button-bg rounded-full"></div>
|
||||
<div class="flex flex-col w-full">
|
||||
<div class="h-3 bg-button-bg rounded-full w-1/2 mb-1"></div>
|
||||
@@ -344,7 +344,7 @@ const messages = defineMessages({
|
||||
</div>
|
||||
</template>
|
||||
<template v-else-if="sortedFriends.length === 0">
|
||||
<div class="text-sm">
|
||||
<div class="text-sm ml-4 mr-1">
|
||||
<div v-if="!userCredentials">
|
||||
<IntlFormatted :message-id="messages.signInToAddFriends">
|
||||
<template #link="{ children }">
|
||||
|
||||
@@ -106,7 +106,7 @@ const messages = defineMessages({
|
||||
:open-by-default="openByDefault"
|
||||
:force-open="isSearching"
|
||||
:button-class="
|
||||
'flex w-full items-center bg-transparent border-0 p-0' +
|
||||
'pl-4 pr-3 flex w-full items-center bg-transparent border-0 p-0' +
|
||||
(isSearching
|
||||
? ''
|
||||
: ' cursor-pointer hover:brightness-[--hover-brightness] active:scale-[0.98] transition-all')
|
||||
@@ -122,7 +122,7 @@ const messages = defineMessages({
|
||||
<div
|
||||
v-for="friend in friends"
|
||||
:key="friend.username"
|
||||
class="group grid items-center grid-cols-[auto_1fr_auto] gap-2 hover:bg-button-bg transition-colors rounded-full mr-1"
|
||||
class="group grid items-center grid-cols-[auto_1fr_auto] gap-2 hover:bg-button-bg transition-colors rounded-full ml-4 mr-1"
|
||||
@contextmenu.prevent.stop="
|
||||
(event) => friendOptions?.showMenu(event, friend, createContextMenuOptions(friend))
|
||||
"
|
||||
|
||||
@@ -79,7 +79,7 @@ watch([() => props.recentInstances, () => showWorlds.value], async () => {
|
||||
})
|
||||
})
|
||||
|
||||
await populateJumpBackIn()
|
||||
populateJumpBackIn()
|
||||
.catch(() => {
|
||||
console.error('Failed to populate jump back in')
|
||||
})
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
import { OverlayScrollbars, type PartialOptions } from 'overlayscrollbars'
|
||||
import type { ObjectDirective } from 'vue'
|
||||
|
||||
const defaultOverlayScrollbarsOptions = Object.freeze<PartialOptions>({
|
||||
scrollbars: {
|
||||
theme: 'os-theme-dark',
|
||||
autoHide: 'leave',
|
||||
autoHideSuspend: true,
|
||||
},
|
||||
})
|
||||
|
||||
const mergeOptions = (options: PartialOptions = {}): PartialOptions => ({
|
||||
...defaultOverlayScrollbarsOptions,
|
||||
...options,
|
||||
scrollbars: {
|
||||
...defaultOverlayScrollbarsOptions.scrollbars,
|
||||
...(options.scrollbars ?? {}),
|
||||
},
|
||||
})
|
||||
|
||||
export const overlayScrollbarsDirective: ObjectDirective<HTMLElement, PartialOptions | undefined> =
|
||||
{
|
||||
mounted(el, binding) {
|
||||
OverlayScrollbars(el, mergeOptions(binding.value))
|
||||
},
|
||||
updated(el, binding) {
|
||||
if (binding.value === binding.oldValue) return
|
||||
const instance = OverlayScrollbars(el)
|
||||
instance?.options(mergeOptions(binding.value))
|
||||
},
|
||||
unmounted(el) {
|
||||
const instance = OverlayScrollbars(el)
|
||||
instance?.destroy()
|
||||
},
|
||||
}
|
||||
@@ -5,39 +5,6 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "تعذر الوصول إلى خوادم المصادقة"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "أضف الخادم للنموذج"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "أضف الخوادم لنموذجك"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "أضف للنموذج"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "أضف للنموذج {instanceName}"
|
||||
},
|
||||
"app.browse.added": {
|
||||
"message": "مضاف"
|
||||
},
|
||||
"app.browse.already-added": {
|
||||
"message": "مضاف فعلا"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "استكشف محتوى"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "استكشف خوادم"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "إخفاء الخوادم المضافة"
|
||||
},
|
||||
"app.browse.hide-installed-content": {
|
||||
"message": "إخفاء المحتوى المضاف"
|
||||
},
|
||||
"app.browse.install-content-to-instance": {
|
||||
"message": "تثبيت محتوى لنموذجك"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "أدخل وصف التعديل..."
|
||||
},
|
||||
@@ -63,28 +30,19 @@
|
||||
"message": "1.0.0"
|
||||
},
|
||||
"app.instance.confirm-delete.admonition-body": {
|
||||
"message": "سيتم حذف جميع البيانات الخاصة لنموذجك نهائيًا، بما في ذلك عوالمك والتكوينات وكل المحتوى المثبت."
|
||||
"message": "سيتم حذف جميع البيانات الخاصة بمثيلك نهائيًا، بما في ذلك عوالمك والتكوينات وكل المحتوى المثبت."
|
||||
},
|
||||
"app.instance.confirm-delete.admonition-header": {
|
||||
"message": "لا يمكن التراجع عن هذا الإجراء"
|
||||
},
|
||||
"app.instance.confirm-delete.delete-button": {
|
||||
"message": "حذف النموذج"
|
||||
"message": "حذف المثيل"
|
||||
},
|
||||
"app.instance.confirm-delete.header": {
|
||||
"message": "حذف النموذج"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "حُزْمَة التعديل هذه مثبته فعلًا في نموذج <bold>{instanceName}</bold>. هل انت متأكد بإرادة نسخه؟"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "إنشاء"
|
||||
"message": "حذف المثيل"
|
||||
},
|
||||
"app.instance.modpack-already-installed.header": {
|
||||
"message": "حُزْمَة التعديل مثبتة بالفعل"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "النموذج"
|
||||
"message": "تم تثبيت حزمة التعديل بالفعل"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "مشروع"
|
||||
@@ -93,7 +51,7 @@
|
||||
"message": "تمت إضافة \"{name}\""
|
||||
},
|
||||
"app.instance.mods.projects-were-added": {
|
||||
"message": "تمت إضافة {count} مشروع"
|
||||
"message": "تمت إضافة {count} من المشاريع"
|
||||
},
|
||||
"app.instance.mods.share-text": {
|
||||
"message": "تحقق من المشاريع التي أستخدمها في حزمة التعديل الخاص بي!"
|
||||
@@ -104,51 +62,6 @@
|
||||
"app.instance.mods.successfully-uploaded": {
|
||||
"message": "تم الرفع بنجاح"
|
||||
},
|
||||
"app.instance.worlds.add-server": {
|
||||
"message": "أضف خادم"
|
||||
},
|
||||
"app.instance.worlds.browse-servers": {
|
||||
"message": "تصفح الخوادم"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "سيتم حذف '{name}' **نهائيا**, و لن هناك أي طريقة لاسترداده."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "هل أنت متيقِّن من رغبتك بحذف هذا العالم نهائيا؟"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "معدّل"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "مفصول"
|
||||
},
|
||||
"app.instance.worlds.filter-online": {
|
||||
"message": "يعمل"
|
||||
},
|
||||
"app.instance.worlds.filter-vanilla": {
|
||||
"message": "الأصلي"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-description": {
|
||||
"message": "أضف خادما أو تصفح لكي تبدأ"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "لم تتم إضافة أي من الخوادم أو العوالم"
|
||||
},
|
||||
"app.instance.worlds.remove-server-description": {
|
||||
"message": "ستتم إزالة '{name}' من قائمتك, إضافة لما داخل اللعبة, و لن يكون هناك أي طريقة لاسترداده."
|
||||
},
|
||||
"app.instance.worlds.remove-server-description-with-address": {
|
||||
"message": "ستتم إزالة '{name}' ({address}) من قائمتك, إضافة لما داخل اللعبة, و لن يكون هناك أي طريقة لاسترداده."
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "هل أنت متيقِّن من رغبتك في إزالة {name}؟"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "ابحث بين ال{count} عوالم..."
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "هذا الخادم"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "المحتوى مطلوب"
|
||||
},
|
||||
@@ -168,10 +81,10 @@
|
||||
"message": "يتطلب هذا الخادم تعديلات للعب. انقر فوق \"تثبيت\" لإعداد الملفات المطلوبة من Modrinth، ثم قم بتشغيله مباشرة إلى الخادم."
|
||||
},
|
||||
"app.modal.install-to-play.shared-instance": {
|
||||
"message": "النماذج المشتركة"
|
||||
"message": "حزمة مشتركة"
|
||||
},
|
||||
"app.modal.install-to-play.shared-server-instance": {
|
||||
"message": "نماذج الخادم مشتركة"
|
||||
"message": "حزمة خادم مشتركة"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "عرض المحتويات"
|
||||
@@ -183,7 +96,7 @@
|
||||
"message": "يلزم التحديث"
|
||||
},
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "هناك تحديث مطلوب للعب بـ {name}. الرجاء التحديث إلى آخر اصدار لتشغيل اللعبة."
|
||||
"message": "هناك تحديث لازم للعب بـ {name}. الرجاء التحديث إلى آخر اصدار لتشغيل اللعبة."
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "تم تفعيل وضع المطوّر."
|
||||
@@ -251,21 +164,6 @@
|
||||
"app.update.reload-to-update": {
|
||||
"message": "أعد التحميل لتثبيت التحديث"
|
||||
},
|
||||
"app.world.server-modal.select-an-option": {
|
||||
"message": "حدد خيارا"
|
||||
},
|
||||
"app.world.world-item.incompatible-version": {
|
||||
"message": "إصدار غير مطابق ({version})"
|
||||
},
|
||||
"app.world.world-item.not-played-yet": {
|
||||
"message": "لم يتم اللعب به"
|
||||
},
|
||||
"app.world.world-item.offline": {
|
||||
"message": "مفصول"
|
||||
},
|
||||
"app.world.world-item.players-online": {
|
||||
"message": "{count} متصل حاليا"
|
||||
},
|
||||
"friends.action.add-friend": {
|
||||
"message": "إضافة صديق"
|
||||
},
|
||||
@@ -365,12 +263,6 @@
|
||||
"instance.edit-world.title": {
|
||||
"message": "تعديل العالم"
|
||||
},
|
||||
"instance.files.adding-files": {
|
||||
"message": "إضافة ملفات ({completed}\\{total})"
|
||||
},
|
||||
"instance.files.save-as": {
|
||||
"message": "حفظ ك..."
|
||||
},
|
||||
"instance.server-modal.address": {
|
||||
"message": "العنوان"
|
||||
},
|
||||
@@ -408,7 +300,7 @@
|
||||
"message": "نسخة النسخة"
|
||||
},
|
||||
"instance.settings.tabs.general.duplicate-instance.description": {
|
||||
"message": "ينشئ نسخة من هذا النموذج شاملا عوالمه, تعديلاتها النصيه, إلخ..."
|
||||
"message": "إنشاء."
|
||||
},
|
||||
"instance.settings.tabs.general.edit-icon": {
|
||||
"message": "تعديل الأيقونة"
|
||||
@@ -588,7 +480,7 @@
|
||||
"message": "يقدمها الخادم"
|
||||
},
|
||||
"search.filter.locked.server-environment.title": {
|
||||
"message": "يمكن إضافة التعديلات **المحليه** فقط إلى نموذج الخادم"
|
||||
"message": "يمكن إضافة التعديلات من جانب العميل فقط إلى مثيل الخادم"
|
||||
},
|
||||
"search.filter.locked.server-game-version.title": {
|
||||
"message": "يتم توفير نسخة اللعبة من قبل الخادم"
|
||||
|
||||
@@ -5,27 +5,6 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Kan ikke nå autentificeringsservere"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Tilføjet til {instanceName}"
|
||||
},
|
||||
"app.browse.added": {
|
||||
"message": "Tilføjet"
|
||||
},
|
||||
"app.browse.already-added": {
|
||||
"message": "Allerede tilføjet"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Opdag indhold"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "Opdag servere"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "Gem tilføjet servere"
|
||||
},
|
||||
"app.browse.hide-installed-content": {
|
||||
"message": "Gem installeret indhold"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Indtast modpack beskrivelse..."
|
||||
},
|
||||
@@ -62,12 +41,6 @@
|
||||
"app.instance.confirm-delete.header": {
|
||||
"message": "Slet instance"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "Denne modpack er allerede installeret i <bold>{instanceName}</bold> instancen. Er du sikker på du vil duplikere den?"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "Opret"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "projekt"
|
||||
},
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
"message": "Authentifizierungsserver sind nicht erreichbar"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "Server zur Instanz hinzufügen"
|
||||
"message": "Server zu Instanz hinzufügen"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Server zu deiner Instanz hinzufügen"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Zur Instanz hinzufügen"
|
||||
"message": "Zu Instanz hinzufügen"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Zu {instanceName} hinzufügen"
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
"message": "No se puede acceder a los servidores de autenticación"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "Añadir servidor a instancia"
|
||||
"message": "Añadir servidor a la instancia"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Añade servidores a tu instancia"
|
||||
"message": "Añadir servidor a tu instancia"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Añadir a instancia"
|
||||
"message": "Añadir a la instancia"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Añadir a {instanceName}"
|
||||
@@ -21,7 +21,7 @@
|
||||
"message": "Añadido"
|
||||
},
|
||||
"app.browse.already-added": {
|
||||
"message": "Ya se ha añadido"
|
||||
"message": "Ya está añadido"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Descubrir contenido"
|
||||
@@ -36,10 +36,10 @@
|
||||
"message": "Ocultar contenido instalado"
|
||||
},
|
||||
"app.browse.install-content-to-instance": {
|
||||
"message": "Instalar contenido a la instancia"
|
||||
"message": "Instalar contenido a una instancia"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Introduce la descripción del modpack..."
|
||||
"message": "Colocá la descripción del modpack..."
|
||||
},
|
||||
"app.export-modal.export-button": {
|
||||
"message": "Exportar"
|
||||
@@ -54,10 +54,10 @@
|
||||
"message": "Nombre del modpack"
|
||||
},
|
||||
"app.export-modal.select-files-label": {
|
||||
"message": "Selecciona archivos y carpetas para incluirlos en el pack"
|
||||
"message": "Selelecciona archivos y carpetas para incluir en el pack"
|
||||
},
|
||||
"app.export-modal.version-number-label": {
|
||||
"message": "Número de la versión"
|
||||
"message": "Nombre de la versión"
|
||||
},
|
||||
"app.export-modal.version-number-placeholder": {
|
||||
"message": "1.0.0"
|
||||
@@ -75,13 +75,13 @@
|
||||
"message": "Eliminar instancia"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "El modpack ya está instalado en la instancia <bold>{instanceName}</bold>. ¿Estás seguro de querer duplicarlo?"
|
||||
"message": "Este modpack ya está instalado en la instancia <bold>{instanceName}</bold>. ¿Estás seguro qué quieres duplicarlo?"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "Crear"
|
||||
},
|
||||
"app.instance.modpack-already-installed.header": {
|
||||
"message": "Este modpack ya está instalado"
|
||||
"message": "Este modpack ya esta instalado"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "Instancia"
|
||||
@@ -90,19 +90,19 @@
|
||||
"message": "proyecto"
|
||||
},
|
||||
"app.instance.mods.project-was-added": {
|
||||
"message": "Se añadió \"{name}\""
|
||||
"message": "\"{name}\" fue añadido"
|
||||
},
|
||||
"app.instance.mods.projects-were-added": {
|
||||
"message": "Se añadieron {count} proyectos"
|
||||
"message": "Se agregaron {count} proyectos"
|
||||
},
|
||||
"app.instance.mods.share-text": {
|
||||
"message": "¡Mira a los proyectos que estoy usando en mi modpack!"
|
||||
"message": "¡Echa un vistazo a los proyectos que estoy usando en mi paquete de mods!"
|
||||
},
|
||||
"app.instance.mods.share-title": {
|
||||
"message": "Compartiendo contenido del modpack"
|
||||
},
|
||||
"app.instance.mods.successfully-uploaded": {
|
||||
"message": "Cargado correctamente"
|
||||
"message": "Subido correctamente"
|
||||
},
|
||||
"app.instance.worlds.add-server": {
|
||||
"message": "Añadir servidor"
|
||||
@@ -111,13 +111,13 @@
|
||||
"message": "Explorar servidores"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "\"{name}\" se **eliminará permanentemente** y no habrá forma de recuperarlo."
|
||||
"message": "'{name}' será **permanentemente eliminado**, y habrá forma de recuperarlo."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "¿Estás seguro de que quieres eliminar este mundo de forma permanente?"
|
||||
"message": "¿Estás seguro de qué quieres eliminar permanentemente este mundo?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Con mods"
|
||||
"message": "Modeado"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "Sin conexión"
|
||||
@@ -132,19 +132,19 @@
|
||||
"message": "Añadir un servidor o explora para comenzar"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "No hay servidores ni mundos añadidos"
|
||||
"message": "No hay servidores o mundos añadidos"
|
||||
},
|
||||
"app.instance.worlds.remove-server-description": {
|
||||
"message": "\"{name}\" se eliminará de tu lista, también dentro del juego, y no podrás recuperarlo."
|
||||
"message": "'{name}' será eliminado de tu lista, incluyendo dentro del juego, y no habrá forma de recuperarlo."
|
||||
},
|
||||
"app.instance.worlds.remove-server-description-with-address": {
|
||||
"message": "\"{name}\" ({address}) se eliminará de tu lista, también dentro del juego, y no podrás recuperarlo."
|
||||
"message": "'{name}' ({address}) será eliminado de tu lista, incluyendo dentro del juego, y no habrá forma de recuperarlo."
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "¿Estás seguro de que quieres eliminar {name}?"
|
||||
"message": "¿Estás seguro de qué quieres eliminar {name}?"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "Buscar en {count} mundos..."
|
||||
"message": "Buscar {count} mundos..."
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "este servidor"
|
||||
@@ -165,7 +165,7 @@
|
||||
"message": "Modpack requerido"
|
||||
},
|
||||
"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."
|
||||
"message": "Este servidor requiere mods para poder jugar. Haz click 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": {
|
||||
"message": "Instancia compartida"
|
||||
@@ -261,7 +261,7 @@
|
||||
"message": "Versión {version} incompatible"
|
||||
},
|
||||
"app.world.world-item.not-played-yet": {
|
||||
"message": "Aún no se ha jugado"
|
||||
"message": "No se ha jugado aún"
|
||||
},
|
||||
"app.world.world-item.offline": {
|
||||
"message": "Desconectado"
|
||||
@@ -285,7 +285,7 @@
|
||||
"message": "¡Podría ser distinto a su nombre de usuario de Minecraft!"
|
||||
},
|
||||
"friends.add-friend.username.placeholder": {
|
||||
"message": "Introduce el nombre de usuario de Modrinth..."
|
||||
"message": "Ingresa tu nombre de usuario de Modrinth..."
|
||||
},
|
||||
"friends.add-friend.username.title": {
|
||||
"message": "¿Cuál es el nombre de usuario de Modrinth de tu amigo?"
|
||||
|
||||
@@ -5,111 +5,30 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Hindi maabot ang mga authentication server"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "Idagdag ang server sa instansiya"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Idagdag ang mga server sa iyong instansiya"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Idagdag sa instansiya"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Idagdag sa {instanceName}"
|
||||
},
|
||||
"app.browse.added": {
|
||||
"message": "Dinagdag"
|
||||
},
|
||||
"app.browse.already-added": {
|
||||
"message": "Nadagdag na"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Tumuklas ng kontento"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "Tumuklas ng mga server"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "Taguin ang mga nadagdag na server"
|
||||
},
|
||||
"app.browse.hide-installed-content": {
|
||||
"message": "Taguin ang mga na-install na kontento"
|
||||
},
|
||||
"app.browse.install-content-to-instance": {
|
||||
"message": "I-install ang kontento sa instansiya"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Ilagay ang paglalarawan ng modpack..."
|
||||
},
|
||||
"app.export-modal.export-button": {
|
||||
"message": "Iluwas"
|
||||
},
|
||||
"app.export-modal.header": {
|
||||
"message": "Iluwas ang modpack"
|
||||
},
|
||||
"app.export-modal.modpack-name-label": {
|
||||
"message": "Pangalan ng Modpack"
|
||||
},
|
||||
"app.export-modal.modpack-name-placeholder": {
|
||||
"message": "Pangalan ng modpack"
|
||||
},
|
||||
"app.export-modal.select-files-label": {
|
||||
"message": "Pumili ng mga talaksan at folder na isasali sa pack"
|
||||
},
|
||||
"app.export-modal.version-number-label": {
|
||||
"message": "Numero ng bersiyon"
|
||||
},
|
||||
"app.export-modal.version-number-placeholder": {
|
||||
"message": "1.0.0"
|
||||
},
|
||||
"app.instance.confirm-delete.admonition-body": {
|
||||
"message": "Ang lahat ng data ng iyong instansiya ay tuluyang mawawala, kabilang na ang iyong mga mundo, kumpigurasyon, at lahat ng na-install na kontento."
|
||||
},
|
||||
"app.instance.confirm-delete.admonition-header": {
|
||||
"message": "Hindi mababawi ang aksiyong ito"
|
||||
},
|
||||
"app.instance.confirm-delete.delete-button": {
|
||||
"message": "Tanggalin ang instansiya"
|
||||
},
|
||||
"app.instance.confirm-delete.header": {
|
||||
"message": "Tanggalin ang instansiya"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "Ilikha"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "Instansiya"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "proyekto"
|
||||
},
|
||||
"app.instance.mods.project-was-added": {
|
||||
"message": "Ang \"{name}\" ay nadagdag"
|
||||
},
|
||||
"app.instance.mods.projects-were-added": {
|
||||
"message": "{count} proyekto ang nadagdag"
|
||||
},
|
||||
"app.instance.mods.share-title": {
|
||||
"message": "Binabahagi ang kontento ng modpack"
|
||||
},
|
||||
"app.instance.mods.successfully-uploaded": {
|
||||
"message": "Matagumpay na na-upload"
|
||||
},
|
||||
"app.instance.worlds.add-server": {
|
||||
"message": "Magdagdag ng server"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Modded"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "Offline"
|
||||
},
|
||||
"app.instance.worlds.filter-online": {
|
||||
"message": "Online"
|
||||
},
|
||||
"app.instance.worlds.filter-vanilla": {
|
||||
"message": "Vanilla"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Nangangailangan ng kontento"
|
||||
},
|
||||
@@ -147,7 +66,7 @@
|
||||
"message": "Kailangang mag-update upang malaro ang {name}. Mangyaring mag-update sa pinakabagong bersiyon upang ma-launch ang laro."
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Binuksan ang moda ng nagdi-develop."
|
||||
"message": "Nakabukas ang moda ng nagdidibelop."
|
||||
},
|
||||
"app.settings.downloading": {
|
||||
"message": "Dina-download ang v{version}"
|
||||
@@ -212,9 +131,6 @@
|
||||
"app.update.reload-to-update": {
|
||||
"message": "Handang ma-install ang update"
|
||||
},
|
||||
"app.world.world-item.offline": {
|
||||
"message": "Offline"
|
||||
},
|
||||
"friends.action.add-friend": {
|
||||
"message": "Magdagdag ng kaibigan"
|
||||
},
|
||||
@@ -285,10 +201,10 @@
|
||||
"message": "Idagdag ang server"
|
||||
},
|
||||
"instance.add-server.resource-pack.disabled": {
|
||||
"message": "Tanggihan"
|
||||
"message": "Hindi pinahihintulotan"
|
||||
},
|
||||
"instance.add-server.resource-pack.enabled": {
|
||||
"message": "Payagan"
|
||||
"message": "Pinahihintulotan"
|
||||
},
|
||||
"instance.add-server.resource-pack.prompt": {
|
||||
"message": "Magpahintulot"
|
||||
@@ -300,7 +216,7 @@
|
||||
"message": "Baguhin ang server"
|
||||
},
|
||||
"instance.edit-world.hide-from-home": {
|
||||
"message": "Itago sa pahina ng Tahanan"
|
||||
"message": "Huwag ipakita sa Home na pahina"
|
||||
},
|
||||
"instance.edit-world.name": {
|
||||
"message": "Pangalan"
|
||||
@@ -483,7 +399,7 @@
|
||||
"message": "Kopyahin ang adres"
|
||||
},
|
||||
"instance.worlds.dont_show_on_home": {
|
||||
"message": "Huwag ipakita sa Tahanan"
|
||||
"message": "Huwag ipakita sa Home"
|
||||
},
|
||||
"instance.worlds.game_already_open": {
|
||||
"message": "Bukas naman ang instansiya"
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
"message": "Impossible de contacter les serveurs d'authentification"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "Ajouter le serveur à l'instance"
|
||||
"message": "Ajouter le serveur a l'instance"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Ajouter des serveurs à votre instance"
|
||||
"message": "Ajouter des serveurs a votre instance"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Ajouter à l'instance"
|
||||
@@ -63,7 +63,7 @@
|
||||
"message": "1.0.0"
|
||||
},
|
||||
"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ée à jamais, y comprit vos mondes, configurations, et contenu supprimé."
|
||||
},
|
||||
"app.instance.confirm-delete.admonition-header": {
|
||||
"message": "Cette action est irréversible"
|
||||
@@ -114,7 +114,7 @@
|
||||
"message": "« {name} » sera supprimé **pour toujours**, et il sera impossible de le récupérer."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir supprimer ce monde pour toujours ?"
|
||||
"message": "Étes-vous sûr.e de vouloir supprimer ce monde pour toujours ?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Moddé"
|
||||
@@ -210,7 +210,7 @@
|
||||
"message": "Gestion des ressources"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} est prête à être installée ! Relancez l'application pour faire la mise à jour maintenant, ou automatiquement à la fermeture de Modrinth App."
|
||||
"message": "Modrinth App v{version} est prête à être installée ! Rechargez pour mettre à jour maintenant, ou automatiquement quand vous fermez Modrinth App."
|
||||
},
|
||||
"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."
|
||||
|
||||
@@ -5,39 +5,9 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "לא ניתן לגשת לשרתי האימות"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "הוסף שרת להתקנה"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "הוסף שרתים להתקנה שלך"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "הוספה להתקנה"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "הוסף אל {instanceName}"
|
||||
},
|
||||
"app.browse.added": {
|
||||
"message": "נוסף"
|
||||
},
|
||||
"app.browse.already-added": {
|
||||
"message": "כבר נוסף"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "גלה תוכן"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "גלה שרתים"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "הסתר שרתים שנוספו"
|
||||
},
|
||||
"app.browse.hide-installed-content": {
|
||||
"message": "הסתר תוכן מותקן"
|
||||
},
|
||||
"app.browse.install-content-to-instance": {
|
||||
"message": "הוספת התוכן להתקנה"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "הזן את תיאור חבילת המודים..."
|
||||
},
|
||||
@@ -74,18 +44,9 @@
|
||||
"app.instance.confirm-delete.header": {
|
||||
"message": "מחיקת התקנה"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "חבילת המודים הזו כבר מותקנת בתוך ההתקנה <bold>{instanceName}</bold>. האם אתה בטוח שברצונך לשכפל אותה?"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "צור"
|
||||
},
|
||||
"app.instance.modpack-already-installed.header": {
|
||||
"message": "חבילת המודים הזאת כבר מותקנת"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "התקנה"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "פרויקט"
|
||||
},
|
||||
@@ -107,48 +68,12 @@
|
||||
"app.instance.worlds.add-server": {
|
||||
"message": "הוסף שרת"
|
||||
},
|
||||
"app.instance.worlds.browse-servers": {
|
||||
"message": "עיון בשרתים"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "'{name}' יימחק לצמיתות, ולא תהיה דרך לשחזר אותו."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "האם אתה בטוח שברצונך למחוק לצמיתות את העולם הזה?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "עם מודים"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "לא מקוון"
|
||||
},
|
||||
"app.instance.worlds.filter-online": {
|
||||
"message": "מחובר"
|
||||
},
|
||||
"app.instance.worlds.filter-vanilla": {
|
||||
"message": "ונילה"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-description": {
|
||||
"message": "הוספת שרת או עיון כדי להתחיל"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "אין שרתים אן עולמות שנוספו"
|
||||
},
|
||||
"app.instance.worlds.remove-server-description": {
|
||||
"message": "'{name}' יוסר מהרשימה שלך, כולל מתוך המשחק, ולא תהיה דרך לשחזר אותו."
|
||||
},
|
||||
"app.instance.worlds.remove-server-description-with-address": {
|
||||
"message": "'{name}' ({address}) יוסר מהרשימה שלך, כולל מתוך המשחק, ולא תהיה דרך לשחזר אותו."
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "אתה בטוח שאתה רוצה להסיר {name}?"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "חיפוש ב-{count} עולמות..."
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "השרת הזה"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "תוכן נדרש"
|
||||
},
|
||||
@@ -251,24 +176,6 @@
|
||||
"app.update.reload-to-update": {
|
||||
"message": "צריך לרענן כדי להתקין את העדכון"
|
||||
},
|
||||
"app.world.server-modal.placeholder-address": {
|
||||
"message": "example.modrinth.gg"
|
||||
},
|
||||
"app.world.server-modal.select-an-option": {
|
||||
"message": "בחר אופציה"
|
||||
},
|
||||
"app.world.world-item.incompatible-version": {
|
||||
"message": "גרסה לא תואמת: {version}"
|
||||
},
|
||||
"app.world.world-item.not-played-yet": {
|
||||
"message": "עדיין לא שוחק"
|
||||
},
|
||||
"app.world.world-item.offline": {
|
||||
"message": "לא מקוון"
|
||||
},
|
||||
"app.world.world-item.players-online": {
|
||||
"message": "{count} מחוברים"
|
||||
},
|
||||
"friends.action.add-friend": {
|
||||
"message": "הוספת חבר"
|
||||
},
|
||||
@@ -368,9 +275,6 @@
|
||||
"instance.edit-world.title": {
|
||||
"message": "ערוך עולם"
|
||||
},
|
||||
"instance.files.adding-files": {
|
||||
"message": "הוספת קבצים ({completed}/{total})"
|
||||
},
|
||||
"instance.files.save-as": {
|
||||
"message": "שמור כ..."
|
||||
},
|
||||
|
||||
@@ -134,12 +134,6 @@
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "Nincs szerver vagy világ"
|
||||
},
|
||||
"app.instance.worlds.remove-server-description": {
|
||||
"message": "'{name}' eltávolításra kerül a listádról, beleértve a játékon belülieket is. Ezt a lépést nem tudod visszavonni."
|
||||
},
|
||||
"app.instance.worlds.remove-server-description-with-address": {
|
||||
"message": "'{name}' ({address}) eltávolításra kerül a listádról, beleértve a játékon belülieket is. Ezt a lépést nem tudod visszavonni."
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "Biztosan el akarod távolítani ezt: {name}?"
|
||||
},
|
||||
@@ -228,7 +222,7 @@
|
||||
"message": "Letöltés ({size})"
|
||||
},
|
||||
"app.update-popup.download-complete": {
|
||||
"message": "Sikeres letöltés"
|
||||
"message": "Letöltés sikeres"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Újratöltés"
|
||||
@@ -252,7 +246,7 @@
|
||||
"message": "A telepítéshez újraindítás szükséges"
|
||||
},
|
||||
"app.world.server-modal.placeholder-address": {
|
||||
"message": "pelda.modrinth.gg"
|
||||
"message": "example.modrinth.gg"
|
||||
},
|
||||
"app.world.server-modal.select-an-option": {
|
||||
"message": "Válassz egy lehetőséget"
|
||||
@@ -552,13 +546,13 @@
|
||||
"message": "Hardcore mód"
|
||||
},
|
||||
"instance.worlds.incompatible_server": {
|
||||
"message": "A szerver nem kompatibilis"
|
||||
"message": "A Szerver nem kompatibilis"
|
||||
},
|
||||
"instance.worlds.linked_server": {
|
||||
"message": "Szerverprojekt által kezelt"
|
||||
},
|
||||
"instance.worlds.no_contact": {
|
||||
"message": "A szerverrel nem lehet kapcsolatot létesíteni"
|
||||
"message": "Nem lehet kapcsolatot létesíteni a szerverrel"
|
||||
},
|
||||
"instance.worlds.no_server_quick_play": {
|
||||
"message": "Csak Minecraft Alpha 1.0.5+-tól tudsz egyből szerverhez csatlakozni"
|
||||
@@ -597,6 +591,6 @@
|
||||
"message": "A játékverziót a szerver biztosítja"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "A betöltőt a szerver biztosítja"
|
||||
"message": "A betöltő a szerver által van megadva"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"message": "Aggiungi server all'istanza"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Aggiungi i server alla tua istanza"
|
||||
"message": "Aggiungi server alla tua istanza"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Aggiungi all'istanza"
|
||||
@@ -24,7 +24,7 @@
|
||||
"message": "Già aggiunto"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Esplora i contenuti"
|
||||
"message": "Esplora contenuti"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "Esplora i server"
|
||||
@@ -36,7 +36,7 @@
|
||||
"message": "Nascondi contenuti installati"
|
||||
},
|
||||
"app.browse.install-content-to-instance": {
|
||||
"message": "Installa contenuti nell'istanza"
|
||||
"message": "Installa nella istanza"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Inserisci descrizione del pacchetto..."
|
||||
@@ -111,10 +111,10 @@
|
||||
"message": "Esplora i server"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "\"{name}\" verrà **eliminato permanentemente** e non ci sarà modo di recuperarlo."
|
||||
"message": "\"{name}\" verrà eliminato permanentemente e non ci sarà modo di recuperarlo."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "Vuoi davvero eliminare questo mondo per sempre?"
|
||||
"message": "Vuoi davvero eliminare permanentemente questo mondo?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Moddato"
|
||||
@@ -132,13 +132,13 @@
|
||||
"message": "Inizia esplorando o aggiungendo un server"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "Nessun server o mondo aggiunto"
|
||||
"message": "Nessun server o mondi aggiunti"
|
||||
},
|
||||
"app.instance.worlds.remove-server-description": {
|
||||
"message": "\"{name}\" sarà rimosso dalla tua lista, inclusa quella nel gioco, e non ci sarà modo di recuperarlo."
|
||||
"message": "\"{name}\" sarà rimosso dalla tua lista, inclusa quella in-gioco, e non ci sarà modo di recuperarlo."
|
||||
},
|
||||
"app.instance.worlds.remove-server-description-with-address": {
|
||||
"message": "\"{name}\" ({address}) sarà rimosso dalla tua lista, inclusa quella nel gioco, e non ci sarà modo di recuperarlo."
|
||||
"message": "\"{name}\" ({address}) sarà rimosso dalla tua lista, inclusa quella in-gioco, e non ci sarà modo di recuperarlo."
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "Vuoi davvero rimuovere {name}?"
|
||||
@@ -246,7 +246,7 @@
|
||||
"message": "Scarica aggiornamento"
|
||||
},
|
||||
"app.update.downloading-update": {
|
||||
"message": "Scaricando l'aggiornamento ({percent}%)"
|
||||
"message": "Scaricando aggiornamento ({percent}%)"
|
||||
},
|
||||
"app.update.reload-to-update": {
|
||||
"message": "Ricarica per installare l'aggiornamento"
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
"message": "オンライン"
|
||||
},
|
||||
"app.instance.worlds.filter-vanilla": {
|
||||
"message": "バニラ"
|
||||
"message": "バニラ(Mod非導入)"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-description": {
|
||||
"message": "サーバーを追加、またはブラウズして始める"
|
||||
@@ -144,7 +144,7 @@
|
||||
"message": "本当に {name} を削除しますか?"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "{count} 個のワールドを検索…"
|
||||
"message": "{count} 個のワールドを検索..."
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "このサーバー"
|
||||
@@ -372,7 +372,7 @@
|
||||
"message": "ファイルを追加中 ({completed}/{total})"
|
||||
},
|
||||
"instance.files.save-as": {
|
||||
"message": "名前をつけて保存…"
|
||||
"message": "名前をつけて保存..."
|
||||
},
|
||||
"instance.server-modal.address": {
|
||||
"message": "アドレス"
|
||||
|
||||
@@ -5,39 +5,6 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Authenticatieservers kunnen niet worden bereikt"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "Voeg server aan instantie toe"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Voeg servers aan instantie toe"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Voeg aan instantie toe"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Voeg aan {instanceName} toe"
|
||||
},
|
||||
"app.browse.added": {
|
||||
"message": "Toegevoegd"
|
||||
},
|
||||
"app.browse.already-added": {
|
||||
"message": "Al toegevoegd"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Ontdek content"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "Ontdek servers"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "Verstop toegevoegde servers"
|
||||
},
|
||||
"app.browse.hide-installed-content": {
|
||||
"message": "Verberg Geïnstalleerde inhoud"
|
||||
},
|
||||
"app.browse.install-content-to-instance": {
|
||||
"message": "Installeer inhoud naar instantie"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Voeg modpack beschrijving in..."
|
||||
},
|
||||
@@ -74,18 +41,9 @@
|
||||
"app.instance.confirm-delete.header": {
|
||||
"message": "Verwijder instantie"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "Deze modpakket is al in de <bold>{instanceName}<bold> instantie geïnstalleerd. Ben je zeker dat je hetgeen wil dupliceren?"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "Maak"
|
||||
},
|
||||
"app.instance.modpack-already-installed.header": {
|
||||
"message": "Modpack is al geïnstalleerd"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "Instantie"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "project"
|
||||
},
|
||||
@@ -104,42 +62,6 @@
|
||||
"app.instance.mods.successfully-uploaded": {
|
||||
"message": "Succesvol geüpload"
|
||||
},
|
||||
"app.instance.worlds.add-server": {
|
||||
"message": "Voeg server toe"
|
||||
},
|
||||
"app.instance.worlds.browse-servers": {
|
||||
"message": "Zoek servers"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "{name} zal **permanent verwijderd** worden en kan niet hersteld worden."
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Gemod"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "Offline"
|
||||
},
|
||||
"app.instance.worlds.filter-online": {
|
||||
"message": "Online"
|
||||
},
|
||||
"app.instance.worlds.filter-vanilla": {
|
||||
"message": "Vanilla"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-description": {
|
||||
"message": "Voeg of zoek een server om te beginnen"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "Noch servers noch werelden toegevoegd"
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "Ben je zeker dat je {name} wil verwijderen?"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "Zoek werelden"
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "deze server"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Content vereist"
|
||||
},
|
||||
@@ -242,24 +164,6 @@
|
||||
"app.update.reload-to-update": {
|
||||
"message": "Herlaad om de update te installeren"
|
||||
},
|
||||
"app.world.server-modal.placeholder-address": {
|
||||
"message": "voorbeeld.modrinth.gg"
|
||||
},
|
||||
"app.world.server-modal.select-an-option": {
|
||||
"message": "Kies een keuze"
|
||||
},
|
||||
"app.world.world-item.incompatible-version": {
|
||||
"message": "Incompatibele versie{version}"
|
||||
},
|
||||
"app.world.world-item.not-played-yet": {
|
||||
"message": "Nog niet gespeeld"
|
||||
},
|
||||
"app.world.world-item.offline": {
|
||||
"message": "Offline"
|
||||
},
|
||||
"app.world.world-item.players-online": {
|
||||
"message": "{count} online"
|
||||
},
|
||||
"friends.action.add-friend": {
|
||||
"message": "Voeg een vriend toe"
|
||||
},
|
||||
@@ -359,12 +263,6 @@
|
||||
"instance.edit-world.title": {
|
||||
"message": "Wereld bewerken"
|
||||
},
|
||||
"instance.files.adding-files": {
|
||||
"message": "Bestanden toevoegen ({completed}/{total})"
|
||||
},
|
||||
"instance.files.save-as": {
|
||||
"message": "Opslaan als..."
|
||||
},
|
||||
"instance.server-modal.address": {
|
||||
"message": "Adres"
|
||||
},
|
||||
|
||||
@@ -111,7 +111,7 @@
|
||||
"message": "Szukaj serwerów"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "'{name}' zostanie **permanentnie usunięty** i nie ma możliwości go odzyskać."
|
||||
"message": "'{name}' zostanie **permanentnie usunięty**, i nie ma możliwości go odzyskać."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "Czy na pewno chcesz trwale usunąć ten świat?"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Os servidores de autenticação do Minecraft podem estar indisponíveis no momento. Verifique sua conexão com a rede e tente novamente mais tarde."
|
||||
"message": "Os servidores de autenticação do Minecraft podem estar indisponíveis no momento. Verifique sua conexão com a internet e tente novamente mais tarde."
|
||||
},
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Não foi possível acessar os servidores de autenticação"
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
"message": "Название сборки"
|
||||
},
|
||||
"app.export-modal.select-files-label": {
|
||||
"message": "Выберите файлы и папки для экспорта"
|
||||
"message": "Выберите файлы или папки для включения в сборку"
|
||||
},
|
||||
"app.export-modal.version-number-label": {
|
||||
"message": "Номер версии"
|
||||
@@ -93,7 +93,7 @@
|
||||
"message": "\"{name}\" был добавлен"
|
||||
},
|
||||
"app.instance.mods.projects-were-added": {
|
||||
"message": "{count} Проектов было добавлено"
|
||||
"message": "Проектов добавлено: {count}"
|
||||
},
|
||||
"app.instance.mods.share-text": {
|
||||
"message": "Посмотрите проекты, которые я использую в своей сборке модов!"
|
||||
@@ -117,7 +117,7 @@
|
||||
"message": "Вы уверены, что хотите удалить этот мир навсегда?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Модовые"
|
||||
"message": "Со сборкой"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "Не в сети"
|
||||
@@ -126,7 +126,7 @@
|
||||
"message": "В сети"
|
||||
},
|
||||
"app.instance.worlds.filter-vanilla": {
|
||||
"message": "Ванильные"
|
||||
"message": "Не модифицировано"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-description": {
|
||||
"message": "Добавить сервер или найти, чтобы начать"
|
||||
@@ -147,7 +147,7 @@
|
||||
"message": "Поиск по {count, plural, one {# миру} other {# мирам}}..."
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "этот сервер"
|
||||
"message": "Этот сервер"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Требуется дополнительный контент"
|
||||
@@ -174,7 +174,7 @@
|
||||
"message": "Общая сборка сервера"
|
||||
},
|
||||
"app.modal.install-to-play.view-contents": {
|
||||
"message": "Посмотреть содержимое"
|
||||
"message": "Посмотреть"
|
||||
},
|
||||
"app.modal.update-to-play.header": {
|
||||
"message": "Обновление перед запуском"
|
||||
|
||||
@@ -111,13 +111,13 @@
|
||||
"message": "Utforska servrar"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "'{name}' kommer ** tas bort permanent**, och det kommer inte finnas något sätt att återskapa den."
|
||||
"message": "'{name}' kommer bli **permanent borttagen**, och det kommer inte finnas något sätt att återskapa den."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "Är du säker på att du vill permanent radera denna värld?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Moddad"
|
||||
"message": "Moddade"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "Offline"
|
||||
@@ -231,7 +231,7 @@
|
||||
"message": "Nedladdning slutförd"
|
||||
},
|
||||
"app.update-popup.reload": {
|
||||
"message": "Ladda om"
|
||||
"message": "Kolla efter uppdateringar"
|
||||
},
|
||||
"app.update-popup.title": {
|
||||
"message": "Uppdatering tillgänglig"
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
"message": "Doğrulama sunucularına erişilemedi"
|
||||
},
|
||||
"app.browse.add-server-to-instance": {
|
||||
"message": "Örneğe sunucuyu ekle"
|
||||
"message": "Sunucuya içerik ekle"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Örneğinize sunucu ekleyin"
|
||||
"message": "İçeriğe sunucu ekle"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Örneğe ekle"
|
||||
"message": "İçerik ekle"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "{instanceName} örneğine ekle"
|
||||
"message": "{instanceName} içeriğine ekle"
|
||||
},
|
||||
"app.browse.added": {
|
||||
"message": "Eklendi"
|
||||
@@ -36,7 +36,7 @@
|
||||
"message": "Yüklü İçerikleri Gizle"
|
||||
},
|
||||
"app.browse.install-content-to-instance": {
|
||||
"message": "İçeriği örneğe yükle"
|
||||
"message": "İçeriği profile yükle"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Mod paketi açıklaması yazın..."
|
||||
@@ -48,7 +48,7 @@
|
||||
"message": "Modpaketi çıkart"
|
||||
},
|
||||
"app.export-modal.modpack-name-label": {
|
||||
"message": "Modpaketi Adı"
|
||||
"message": "Modpaketi adı"
|
||||
},
|
||||
"app.export-modal.modpack-name-placeholder": {
|
||||
"message": "Modpaketi adı"
|
||||
@@ -69,10 +69,10 @@
|
||||
"message": "Bu eylem geri alınamaz"
|
||||
},
|
||||
"app.instance.confirm-delete.delete-button": {
|
||||
"message": "Örneği Sil"
|
||||
"message": "İçeriği Sil"
|
||||
},
|
||||
"app.instance.confirm-delete.header": {
|
||||
"message": "Örneği Sil"
|
||||
"message": "İçeriği Sil"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "Bu mod paketi zaten <bold>{instanceName}</bold> örneğinde yüklü. Kopyalamak istediğinizden emin misiniz?"
|
||||
@@ -84,7 +84,7 @@
|
||||
"message": "Modpaketi zaten kurulu"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "Örnek"
|
||||
"message": "İçerik"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "proje"
|
||||
@@ -102,16 +102,16 @@
|
||||
"message": "Mod paketi içeriğini paylaşıyorsunuz"
|
||||
},
|
||||
"app.instance.mods.successfully-uploaded": {
|
||||
"message": "Başarıyla yüklendi"
|
||||
"message": "Başarı ile yüklendi"
|
||||
},
|
||||
"app.instance.worlds.add-server": {
|
||||
"message": "Sunucu Ekle"
|
||||
},
|
||||
"app.instance.worlds.browse-servers": {
|
||||
"message": "Sunucuları Keşfet"
|
||||
"message": "Sunucuya göz at"
|
||||
},
|
||||
"app.instance.worlds.delete-world-description": {
|
||||
"message": "'{name}' **kalıcı olarak silinecek** ve geri getirilmesi mümkün olmayacaktır."
|
||||
"message": "'{name}' kalıcı olarak silinecek ve geri getirilmesi mümkün olmayacaktır."
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "Bu dünyayı kalıcı olarak silmek istediğinizden emin misiniz?"
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
"message": "Дослідити сервера"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "Сховати додані сервери"
|
||||
"message": "Сховати додані сервера"
|
||||
},
|
||||
"app.browse.hide-installed-content": {
|
||||
"message": "Сховати встановлений уміст"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"message": "将服务器添加到你的实例"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "前往实例"
|
||||
"message": "添加到实例"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "添加到 {instanceName}"
|
||||
@@ -75,7 +75,7 @@
|
||||
"message": "删除实例"
|
||||
},
|
||||
"app.instance.modpack-already-installed.body": {
|
||||
"message": "该整合包已经被安装到实例<bold>{instanceName}</bold> 中了。你确定要重复安装吗?"
|
||||
"message": "该整合包已经被安装到实例<bold>{instanceName}</bold>中了。你确定要重复安装吗?"
|
||||
},
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "创建"
|
||||
@@ -90,7 +90,7 @@
|
||||
"message": "项目"
|
||||
},
|
||||
"app.instance.mods.project-was-added": {
|
||||
"message": "已添加 “{name}”"
|
||||
"message": "已添加“{name}”"
|
||||
},
|
||||
"app.instance.mods.projects-were-added": {
|
||||
"message": "已添加 {count} 个项目"
|
||||
@@ -117,7 +117,7 @@
|
||||
"message": "你确定要永久删除这个世界吗?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "模组适配"
|
||||
"message": "修改版"
|
||||
},
|
||||
"app.instance.worlds.filter-offline": {
|
||||
"message": "离线"
|
||||
@@ -441,7 +441,7 @@
|
||||
"message": "名称"
|
||||
},
|
||||
"instance.settings.tabs.hooks": {
|
||||
"message": "启动 Hooks"
|
||||
"message": "启动Hooks"
|
||||
},
|
||||
"instance.settings.tabs.hooks.custom-hooks": {
|
||||
"message": "自定义启动Hooks"
|
||||
|
||||
@@ -216,7 +216,7 @@
|
||||
"message": "Modrinth App v{version} 已完成下載!立即重新載入以更新,或在關閉 Modrinth App 時自動更新。"
|
||||
},
|
||||
"app.update-popup.body.linux": {
|
||||
"message": "Modrinth App v{version} 現已推出。請使用軟體包管理員進行更新,以取得最新的功能與修正!"
|
||||
"message": "Modrinth App v{version} 現已推出。請使用套件管理員進行更新,以取得最新的功能與修正!"
|
||||
},
|
||||
"app.update-popup.body.metered": {
|
||||
"message": "Modrinth App v{version} 現已推出!由於你目前使用的是計量付費網路,我們並未自動下載更新。"
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import 'floating-vue/dist/style.css'
|
||||
import 'overlayscrollbars/overlayscrollbars.css'
|
||||
|
||||
import * as Sentry from '@sentry/vue'
|
||||
import { VueScanPlugin } from '@taijased/vue-render-tracker'
|
||||
@@ -9,7 +8,6 @@ import { createPinia } from 'pinia'
|
||||
import { createApp } from 'vue'
|
||||
|
||||
import App from '@/App.vue'
|
||||
import { overlayScrollbarsDirective } from '@/directives/overlayScrollbars'
|
||||
import i18nPlugin from '@/plugins/i18n'
|
||||
import i18nDebugPlugin from '@/plugins/i18n-debug'
|
||||
import router from '@/routes'
|
||||
@@ -52,6 +50,5 @@ app.use(FloatingVue, {
|
||||
})
|
||||
app.use(i18nPlugin)
|
||||
app.use(i18nDebugPlugin)
|
||||
app.directive('overlay-scrollbars', overlayScrollbarsDirective)
|
||||
|
||||
app.mount('#app')
|
||||
|
||||
@@ -1,26 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
injectModrinthClient,
|
||||
injectModrinthServerContext,
|
||||
ServersManageBackupsPage,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
import { injectModrinthServerContext, ServersManageBackupsPage } from '@modrinth/ui'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { serverId, worldId, isServerRunning } = injectModrinthServerContext()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
if (worldId.value) {
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['backups', 'list', serverId],
|
||||
queryFn: () => client.archon.backups_v1.list(serverId, worldId.value!),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
}
|
||||
const { isServerRunning } = injectModrinthServerContext()
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -1,27 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
injectModrinthClient,
|
||||
injectModrinthServerContext,
|
||||
ServersManageContentPage,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { serverId, worldId } = injectModrinthServerContext()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
if (worldId.value) {
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['content', 'list', 'v1', serverId],
|
||||
queryFn: () =>
|
||||
client.archon.content_v1.getAddons(serverId, worldId.value!, { from_modpack: false }),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
}
|
||||
import { ServersManageContentPage } from '@modrinth/ui'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -1,24 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
injectModrinthClient,
|
||||
injectModrinthServerContext,
|
||||
ServersManageFilesPage,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { serverId } = injectModrinthServerContext()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['files', serverId, '/'],
|
||||
queryFn: () => client.kyros.files_v0.listDirectory('/', 1, 2000),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
import { ServersManageFilesPage } from '@modrinth/ui'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
<template>
|
||||
<div class="h-full w-full pt-6">
|
||||
<div class="h-full w-full py-6">
|
||||
<ServersManageRootLayout
|
||||
:server-id="serverId"
|
||||
:reload-page="() => router.go(0)"
|
||||
:resolve-viewer="resolveViewer"
|
||||
:show-copy-id-action="themeStore.devMode"
|
||||
:auth-user="authUser"
|
||||
:fetch-intercom-token="fetchIntercomToken"
|
||||
:navigate-to-billing="() => openUrl('https://modrinth.com/settings/billing')"
|
||||
:navigate-to-servers="() => router.push('/hosting/manage')"
|
||||
:browse-modpacks="
|
||||
@@ -35,6 +33,9 @@
|
||||
@reinstall="onReinstall"
|
||||
@reinstall-failed="onReinstallFailed"
|
||||
/>
|
||||
<template #fallback>
|
||||
<LoadingIndicator />
|
||||
</template>
|
||||
</Suspense>
|
||||
</template>
|
||||
</RouterView>
|
||||
@@ -45,14 +46,12 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import type { Archon, Labrinth } from '@modrinth/api-client'
|
||||
import { injectAuth, injectModrinthClient, ServersManageRootLayout } from '@modrinth/ui'
|
||||
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||
import { fetch as tauriFetch } from '@tauri-apps/plugin-http'
|
||||
import { injectAuth, LoadingIndicator, ServersManageRootLayout } from '@modrinth/ui'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||
import { computed, watch } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
|
||||
import { config } from '@/config'
|
||||
import { get_user } from '@/helpers/cache'
|
||||
import { get as getCreds } from '@/helpers/mr_auth'
|
||||
import { useBreadcrumbs } from '@/store/breadcrumbs'
|
||||
@@ -61,8 +60,6 @@ import { useTheming } from '@/store/theme'
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
const auth = injectAuth()
|
||||
const client = injectModrinthClient()
|
||||
const queryClient = useQueryClient()
|
||||
const themeStore = useTheming()
|
||||
const breadcrumbs = useBreadcrumbs()
|
||||
|
||||
@@ -71,18 +68,6 @@ const serverId = computed(() => {
|
||||
return Array.isArray(rawId) ? rawId[0] : (rawId ?? '')
|
||||
})
|
||||
|
||||
if (serverId.value) {
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['servers', 'detail', serverId.value],
|
||||
queryFn: () => client.archon.servers_v0.get(serverId.value)!,
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
}
|
||||
|
||||
const { data: serverData } = useQuery({
|
||||
queryKey: computed(() => ['servers', 'detail', serverId.value]),
|
||||
queryFn: () => null as unknown as Archon.Servers.v0.Server,
|
||||
@@ -112,37 +97,6 @@ watch(
|
||||
},
|
||||
)
|
||||
|
||||
const authUser = computed(() => {
|
||||
const user = auth.user.value
|
||||
if (!user?.id) return undefined
|
||||
return {
|
||||
id: user.id,
|
||||
username: user.username,
|
||||
email: user.email ?? '',
|
||||
created: user.created,
|
||||
}
|
||||
})
|
||||
|
||||
async function fetchIntercomToken(): Promise<{ token: string }> {
|
||||
const credentials = await getCreds()
|
||||
if (!credentials?.session) {
|
||||
throw new Error('Not authenticated')
|
||||
}
|
||||
const response = await tauriFetch(
|
||||
`${config.siteUrl}/api/intercom/messenger-jwt?server_id=${encodeURIComponent(serverId.value)}`,
|
||||
{
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Authorization: `Bearer ${credentials.session}`,
|
||||
},
|
||||
},
|
||||
)
|
||||
if (!response.ok) {
|
||||
throw new Error(`Failed to fetch Intercom token: ${response.status}`)
|
||||
}
|
||||
return (await response.json()) as { token: string }
|
||||
}
|
||||
|
||||
async function resolveViewer(): Promise<{ userId: string | null; userRole: string | null }> {
|
||||
const credentials = await getCreds().catch(() => null)
|
||||
if (!credentials?.user_id) {
|
||||
|
||||
@@ -6,7 +6,6 @@ import {
|
||||
FilePageLayout,
|
||||
injectNotificationManager,
|
||||
provideFileManager,
|
||||
ReadyTransition,
|
||||
useDebugLogger,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
@@ -55,8 +54,6 @@ const messages = defineMessages({
|
||||
|
||||
const instanceRoot = ref('')
|
||||
const items = ref<FileItem[]>([])
|
||||
/** True until the first directory read for the current instance path finishes (initial load only). */
|
||||
const firstPaintPending = ref(true)
|
||||
const loading = ref(true)
|
||||
const error = ref<Error | null>(null)
|
||||
const currentPath = ref('')
|
||||
@@ -126,7 +123,6 @@ async function refresh() {
|
||||
items.value = []
|
||||
} finally {
|
||||
loading.value = false
|
||||
firstPaintPending.value = false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -309,7 +305,6 @@ watch(
|
||||
() => props.instance.path,
|
||||
async () => {
|
||||
debug('watch instance.path: changed to', props.instance.path)
|
||||
firstPaintPending.value = true
|
||||
instanceRoot.value = await get_full_path(props.instance.path)
|
||||
currentPath.value = ''
|
||||
await refresh()
|
||||
@@ -346,7 +341,5 @@ provideFileManager({
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ReadyTransition :pending="firstPaintPending">
|
||||
<FilePageLayout :show-refresh-button="true" />
|
||||
</ReadyTransition>
|
||||
<FilePageLayout :show-refresh-button="true" />
|
||||
</template>
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
<template>
|
||||
<div v-if="instance" class="flex h-full flex-col">
|
||||
<div
|
||||
class="shrink-0 p-6 pr-2 pb-4"
|
||||
@contextmenu.prevent.stop="(event) => handleRightClick(event)"
|
||||
>
|
||||
<div v-if="instance">
|
||||
<div class="p-6 pr-2 pb-4" @contextmenu.prevent.stop="(event) => handleRightClick(event)">
|
||||
<ExportModal ref="exportModal" :instance="instance" />
|
||||
<InstanceSettingsModal
|
||||
:key="instance.path"
|
||||
@@ -208,17 +205,21 @@
|
||||
</template>
|
||||
</ContentPageHeader>
|
||||
</div>
|
||||
<div class="shrink-0 px-6">
|
||||
<div class="px-6">
|
||||
<NavTabs :links="tabs" />
|
||||
</div>
|
||||
<div v-if="!!instance" class="min-h-0 flex-1 overflow-y-auto p-6 pt-4">
|
||||
<div v-if="!!instance" class="p-6 pt-4">
|
||||
<RouterView
|
||||
v-if="route.path.startsWith('/instance')"
|
||||
v-slot="{ Component }"
|
||||
:key="instance.path"
|
||||
>
|
||||
<template v-if="Component">
|
||||
<Suspense :key="instance.path">
|
||||
<Suspense
|
||||
:key="instance.path"
|
||||
@pending="loadingBar.startLoading()"
|
||||
@resolve="loadingBar.stopLoading()"
|
||||
>
|
||||
<component
|
||||
:is="Component"
|
||||
:instance="instance"
|
||||
@@ -231,6 +232,9 @@
|
||||
@play="updatePlayState"
|
||||
@stop="() => stopInstance('InstanceSubpage')"
|
||||
></component>
|
||||
<template #fallback>
|
||||
<LoadingIndicator />
|
||||
</template>
|
||||
</Suspense>
|
||||
</template>
|
||||
</RouterView>
|
||||
@@ -289,6 +293,7 @@ import {
|
||||
ButtonStyled,
|
||||
ContentPageHeader,
|
||||
injectNotificationManager,
|
||||
LoadingIndicator,
|
||||
NavTabs,
|
||||
OverflowMenu,
|
||||
ServerOnlinePlayers,
|
||||
@@ -296,7 +301,6 @@ import {
|
||||
ServerRecentPlays,
|
||||
ServerRegion,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
import { convertFileSrc } from '@tauri-apps/api/core'
|
||||
import dayjs from 'dayjs'
|
||||
import duration from 'dayjs/plugin/duration'
|
||||
@@ -316,17 +320,16 @@ import { get_by_profile_path } from '@/helpers/process'
|
||||
import { finish_install, get, get_full_path, kill, run } from '@/helpers/profile'
|
||||
import type { GameInstance } from '@/helpers/types'
|
||||
import { showProfileInFolder } from '@/helpers/utils.js'
|
||||
import { get_server_status, refreshWorlds } from '@/helpers/worlds'
|
||||
import { get_server_status } from '@/helpers/worlds'
|
||||
import { injectServerInstall } from '@/providers/server-install'
|
||||
import { handleSevereError } from '@/store/error.js'
|
||||
import { useBreadcrumbs } from '@/store/state'
|
||||
import { useBreadcrumbs, useLoading } from '@/store/state'
|
||||
|
||||
dayjs.extend(duration)
|
||||
dayjs.extend(relativeTime)
|
||||
|
||||
const { handleError } = injectNotificationManager()
|
||||
const { playServerProject } = injectServerInstall()
|
||||
const queryClient = useQueryClient()
|
||||
const route = useRoute()
|
||||
|
||||
const router = useRouter()
|
||||
@@ -386,14 +389,6 @@ async function fetchInstance() {
|
||||
}
|
||||
|
||||
fetchDeferredData()
|
||||
|
||||
if (instance.value) {
|
||||
queryClient.prefetchQuery({
|
||||
queryKey: ['worlds', instance.value.path],
|
||||
queryFn: () => refreshWorlds(instance.value!.path),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function fetchDeferredData() {
|
||||
@@ -473,6 +468,8 @@ if (instance.value) {
|
||||
})
|
||||
}
|
||||
|
||||
const loadingBar = useLoading()
|
||||
|
||||
const options = ref<InstanceType<typeof ContextMenu> | null>(null)
|
||||
|
||||
const startInstance = async (context: string) => {
|
||||
|
||||
@@ -1,67 +1,65 @@
|
||||
<template>
|
||||
<ReadyTransition :pending="loading">
|
||||
<ContentPageLayout>
|
||||
<template #modals>
|
||||
<ShareModalWrapper
|
||||
ref="shareModal"
|
||||
:share-title="formatMessage(messages.shareTitle)"
|
||||
:share-text="formatMessage(messages.shareText)"
|
||||
:open-in-new-tab="false"
|
||||
/>
|
||||
<ModpackContentModal
|
||||
ref="modpackContentModal"
|
||||
:modpack-name="linkedModpackProject?.title"
|
||||
:modpack-icon-url="linkedModpackProject?.icon_url ?? undefined"
|
||||
:enable-toggle="!props.isServerInstance"
|
||||
:get-overflow-options="getOverflowOptions"
|
||||
:switch-version="handleSwitchVersion"
|
||||
@update:enabled="handleModpackContentToggle"
|
||||
@bulk:enable="handleModpackContentBulkToggle"
|
||||
@bulk:disable="handleModpackContentBulkToggle"
|
||||
/>
|
||||
<ConfirmModpackUpdateModal
|
||||
ref="modpackUpdateConfirmModal"
|
||||
:downgrade="isModpackUpdateDowngrade"
|
||||
:backup-tip="
|
||||
[linkedModpackProject?.title, pendingModpackUpdateVersion?.version_number]
|
||||
.filter(Boolean)
|
||||
.join(' ')
|
||||
"
|
||||
@confirm="handleModpackUpdateConfirm"
|
||||
@cancel="handleModpackUpdateCancel"
|
||||
/>
|
||||
<ExportModal v-if="projects.length > 0" ref="exportModal" :instance="instance" />
|
||||
<ContentUpdaterModal
|
||||
v-if="updatingProject || updatingModpack"
|
||||
ref="contentUpdaterModal"
|
||||
:versions="updatingProjectVersions"
|
||||
:current-game-version="instance.game_version"
|
||||
:current-loader="instance.loader"
|
||||
:current-version-id="
|
||||
updatingModpack
|
||||
? (instance.linked_data?.version_id ?? '')
|
||||
: (updatingProject?.version?.id ?? '')
|
||||
"
|
||||
:is-app="true"
|
||||
:project-type="updatingModpack ? 'modpack' : updatingProject?.project_type"
|
||||
:project-icon-url="
|
||||
updatingModpack ? linkedModpackProject?.icon_url : updatingProject?.project?.icon_url
|
||||
"
|
||||
:project-name="
|
||||
updatingModpack
|
||||
? (linkedModpackProject?.title ?? formatMessage(commonMessages.modpackLabel))
|
||||
: (updatingProject?.project?.title ?? updatingProject?.file_name)
|
||||
"
|
||||
:loading="loadingVersions"
|
||||
:loading-changelog="loadingChangelog"
|
||||
@update="handleModalUpdate"
|
||||
@cancel="resetUpdateState"
|
||||
@version-select="handleVersionSelect"
|
||||
@version-hover="handleVersionHover"
|
||||
/>
|
||||
</template>
|
||||
</ContentPageLayout>
|
||||
</ReadyTransition>
|
||||
<ContentPageLayout>
|
||||
<template #modals>
|
||||
<ShareModalWrapper
|
||||
ref="shareModal"
|
||||
:share-title="formatMessage(messages.shareTitle)"
|
||||
:share-text="formatMessage(messages.shareText)"
|
||||
:open-in-new-tab="false"
|
||||
/>
|
||||
<ModpackContentModal
|
||||
ref="modpackContentModal"
|
||||
:modpack-name="linkedModpackProject?.title"
|
||||
:modpack-icon-url="linkedModpackProject?.icon_url ?? undefined"
|
||||
:enable-toggle="!props.isServerInstance"
|
||||
:get-overflow-options="getOverflowOptions"
|
||||
:switch-version="handleSwitchVersion"
|
||||
@update:enabled="handleModpackContentToggle"
|
||||
@bulk:enable="handleModpackContentBulkToggle"
|
||||
@bulk:disable="handleModpackContentBulkToggle"
|
||||
/>
|
||||
<ConfirmModpackUpdateModal
|
||||
ref="modpackUpdateConfirmModal"
|
||||
:downgrade="isModpackUpdateDowngrade"
|
||||
:backup-tip="
|
||||
[linkedModpackProject?.title, pendingModpackUpdateVersion?.version_number]
|
||||
.filter(Boolean)
|
||||
.join(' ')
|
||||
"
|
||||
@confirm="handleModpackUpdateConfirm"
|
||||
@cancel="handleModpackUpdateCancel"
|
||||
/>
|
||||
<ExportModal v-if="projects.length > 0" ref="exportModal" :instance="instance" />
|
||||
<ContentUpdaterModal
|
||||
v-if="updatingProject || updatingModpack"
|
||||
ref="contentUpdaterModal"
|
||||
:versions="updatingProjectVersions"
|
||||
:current-game-version="instance.game_version"
|
||||
:current-loader="instance.loader"
|
||||
:current-version-id="
|
||||
updatingModpack
|
||||
? (instance.linked_data?.version_id ?? '')
|
||||
: (updatingProject?.version?.id ?? '')
|
||||
"
|
||||
:is-app="true"
|
||||
:project-type="updatingModpack ? 'modpack' : updatingProject?.project_type"
|
||||
:project-icon-url="
|
||||
updatingModpack ? linkedModpackProject?.icon_url : updatingProject?.project?.icon_url
|
||||
"
|
||||
:project-name="
|
||||
updatingModpack
|
||||
? (linkedModpackProject?.title ?? formatMessage(commonMessages.modpackLabel))
|
||||
: (updatingProject?.project?.title ?? updatingProject?.file_name)
|
||||
"
|
||||
:loading="loadingVersions"
|
||||
:loading-changelog="loadingChangelog"
|
||||
@update="handleModalUpdate"
|
||||
@cancel="resetUpdateState"
|
||||
@version-select="handleVersionSelect"
|
||||
@version-hover="handleVersionHover"
|
||||
/>
|
||||
</template>
|
||||
</ContentPageLayout>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
@@ -84,7 +82,6 @@ import {
|
||||
type OverflowMenuOption,
|
||||
provideAppBackup,
|
||||
provideContentManager,
|
||||
ReadyTransition,
|
||||
useDebugLogger,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
|
||||
@@ -37,109 +37,22 @@
|
||||
:description="formatMessage(messages.deleteWorldDescription, { name: worldToDelete?.name })"
|
||||
@proceed="proceedDeleteWorld"
|
||||
/>
|
||||
<ReadyTransition :pending="worldsReadyPending">
|
||||
<div v-if="dedupedWorlds.length > 0" class="flex flex-col gap-4">
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<StyledInput
|
||||
v-model="searchFilter"
|
||||
:icon="SearchIcon"
|
||||
type="text"
|
||||
autocomplete="off"
|
||||
:spellcheck="false"
|
||||
input-class="!h-10"
|
||||
wrapper-class="flex-1 min-w-0"
|
||||
clearable
|
||||
:placeholder="
|
||||
formatMessage(messages.searchWorldsPlaceholder, { count: dedupedWorlds.length })
|
||||
"
|
||||
/>
|
||||
<div class="flex gap-2">
|
||||
<ButtonStyled type="outlined">
|
||||
<button class="!h-10 !border-button-bg !border-[1px]" @click="addServerModal?.show()">
|
||||
<PlusIcon class="size-5" />
|
||||
{{ formatMessage(messages.addServer) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="!h-10 flex items-center gap-2"
|
||||
@click="
|
||||
router.push({ path: '/browse/server', query: { i: instance.path, from: 'worlds' } })
|
||||
"
|
||||
>
|
||||
<CompassIcon class="size-5" />
|
||||
<span>{{ formatMessage(messages.browseServers) }}</span>
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center justify-between gap-2">
|
||||
<div class="flex flex-wrap items-center gap-1.5">
|
||||
<FilterIcon class="size-5 text-secondary" />
|
||||
<button
|
||||
:class="filterPillClass(selectedFilters.length === 0)"
|
||||
@click="selectedFilters = []"
|
||||
>
|
||||
{{ formatMessage(commonMessages.allProjectType) }}
|
||||
</button>
|
||||
<button
|
||||
v-for="option in filterOptions"
|
||||
:key="option.id"
|
||||
:class="filterPillClass(selectedFilters.includes(option.id))"
|
||||
@click="toggleFilter(option.id)"
|
||||
>
|
||||
{{ option.label }}
|
||||
</button>
|
||||
</div>
|
||||
<ButtonStyled type="transparent" hover-color-fill="none">
|
||||
<button :disabled="refreshingAll" @click="refreshAllWorlds">
|
||||
<RefreshCwIcon :class="refreshingAll ? 'animate-spin' : ''" />
|
||||
{{ formatMessage(commonMessages.refreshButton) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
<div class="flex flex-col w-full gap-2">
|
||||
<WorldItem
|
||||
v-for="world in filteredWorlds"
|
||||
:key="`world-${world.type}-${world.type == 'singleplayer' ? world.path : `${world.address}-${world.index}`}`"
|
||||
:world="world"
|
||||
:managed="world.type === 'server' ? isManagedServerWorld(world) : false"
|
||||
:highlighted="highlightedWorld === getWorldIdentifier(world)"
|
||||
:supports-server-quick-play="supportsServerQuickPlay"
|
||||
:supports-world-quick-play="supportsWorldQuickPlay"
|
||||
:current-protocol="protocolVersion"
|
||||
:playing-instance="playing"
|
||||
:playing-world="worldsMatch(world, worldPlaying)"
|
||||
:starting-instance="startingInstance"
|
||||
:refreshing="world.type === 'server' ? serverData[world.address]?.refreshing : undefined"
|
||||
:server-status="world.type === 'server' ? serverData[world.address]?.status : undefined"
|
||||
:rendered-motd="
|
||||
world.type === 'server' ? serverData[world.address]?.renderedMotd : undefined
|
||||
"
|
||||
:game-mode="world.type === 'singleplayer' ? GAME_MODES[world.game_mode] : undefined"
|
||||
@play="() => joinWorld(world)"
|
||||
@stop="() => emit('stop')"
|
||||
@refresh="() => refreshServer((world as ServerWorld).address)"
|
||||
@edit="
|
||||
() =>
|
||||
world.type === 'singleplayer'
|
||||
? editWorldModal?.show(world)
|
||||
: isManagedServerWorld(world)
|
||||
? undefined
|
||||
: editServerModal?.show(world)
|
||||
"
|
||||
@delete="() => !isManagedServerWorld(world) && promptToRemoveWorld(world)"
|
||||
@open-folder="(world: SingleplayerWorld) => showWorldInFolder(instance.path, world.path)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<EmptyState
|
||||
v-else
|
||||
type="empty-inbox"
|
||||
:heading="formatMessage(messages.noWorldsHeading)"
|
||||
:description="formatMessage(messages.noWorldsDescription)"
|
||||
>
|
||||
<template #actions>
|
||||
<div v-if="dedupedWorlds.length > 0" class="flex flex-col gap-4">
|
||||
<div class="flex flex-wrap items-center gap-2">
|
||||
<StyledInput
|
||||
v-model="searchFilter"
|
||||
:icon="SearchIcon"
|
||||
type="text"
|
||||
autocomplete="off"
|
||||
:spellcheck="false"
|
||||
input-class="!h-10"
|
||||
wrapper-class="flex-1 min-w-0"
|
||||
clearable
|
||||
:placeholder="
|
||||
formatMessage(messages.searchWorldsPlaceholder, { count: dedupedWorlds.length })
|
||||
"
|
||||
/>
|
||||
<div class="flex gap-2">
|
||||
<ButtonStyled type="outlined">
|
||||
<button class="!h-10 !border-button-bg !border-[1px]" @click="addServerModal?.show()">
|
||||
<PlusIcon class="size-5" />
|
||||
@@ -157,9 +70,94 @@
|
||||
<span>{{ formatMessage(messages.browseServers) }}</span>
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
</EmptyState>
|
||||
</ReadyTransition>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-wrap items-center justify-between gap-2">
|
||||
<div class="flex flex-wrap items-center gap-1.5">
|
||||
<FilterIcon class="size-5 text-secondary" />
|
||||
<button
|
||||
:class="filterPillClass(selectedFilters.length === 0)"
|
||||
@click="selectedFilters = []"
|
||||
>
|
||||
{{ formatMessage(commonMessages.allProjectType) }}
|
||||
</button>
|
||||
<button
|
||||
v-for="option in filterOptions"
|
||||
:key="option.id"
|
||||
:class="filterPillClass(selectedFilters.includes(option.id))"
|
||||
@click="toggleFilter(option.id)"
|
||||
>
|
||||
{{ option.label }}
|
||||
</button>
|
||||
</div>
|
||||
<ButtonStyled type="transparent" hover-color-fill="none">
|
||||
<button :disabled="refreshingAll" @click="refreshAllWorlds">
|
||||
<RefreshCwIcon :class="refreshingAll ? 'animate-spin' : ''" />
|
||||
{{ formatMessage(commonMessages.refreshButton) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
<div class="flex flex-col w-full gap-2">
|
||||
<WorldItem
|
||||
v-for="world in filteredWorlds"
|
||||
:key="`world-${world.type}-${world.type == 'singleplayer' ? world.path : `${world.address}-${world.index}`}`"
|
||||
:world="world"
|
||||
:managed="world.type === 'server' ? isManagedServerWorld(world) : false"
|
||||
:highlighted="highlightedWorld === getWorldIdentifier(world)"
|
||||
:supports-server-quick-play="supportsServerQuickPlay"
|
||||
:supports-world-quick-play="supportsWorldQuickPlay"
|
||||
:current-protocol="protocolVersion"
|
||||
:playing-instance="playing"
|
||||
:playing-world="worldsMatch(world, worldPlaying)"
|
||||
:starting-instance="startingInstance"
|
||||
:refreshing="world.type === 'server' ? serverData[world.address]?.refreshing : undefined"
|
||||
:server-status="world.type === 'server' ? serverData[world.address]?.status : undefined"
|
||||
:rendered-motd="
|
||||
world.type === 'server' ? serverData[world.address]?.renderedMotd : undefined
|
||||
"
|
||||
:game-mode="world.type === 'singleplayer' ? GAME_MODES[world.game_mode] : undefined"
|
||||
@play="() => joinWorld(world)"
|
||||
@stop="() => emit('stop')"
|
||||
@refresh="() => refreshServer((world as ServerWorld).address)"
|
||||
@edit="
|
||||
() =>
|
||||
world.type === 'singleplayer'
|
||||
? editWorldModal?.show(world)
|
||||
: isManagedServerWorld(world)
|
||||
? undefined
|
||||
: editServerModal?.show(world)
|
||||
"
|
||||
@delete="() => !isManagedServerWorld(world) && promptToRemoveWorld(world)"
|
||||
@open-folder="(world: SingleplayerWorld) => showWorldInFolder(instance.path, world.path)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<EmptyState
|
||||
v-else
|
||||
type="empty-inbox"
|
||||
:heading="formatMessage(messages.noWorldsHeading)"
|
||||
:description="formatMessage(messages.noWorldsDescription)"
|
||||
>
|
||||
<template #actions>
|
||||
<ButtonStyled type="outlined">
|
||||
<button class="!h-10 !border-button-bg !border-[1px]" @click="addServerModal?.show()">
|
||||
<PlusIcon class="size-5" />
|
||||
{{ formatMessage(messages.addServer) }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
class="!h-10 flex items-center gap-2"
|
||||
@click="
|
||||
router.push({ path: '/browse/server', query: { i: instance.path, from: 'worlds' } })
|
||||
"
|
||||
>
|
||||
<CompassIcon class="size-5" />
|
||||
<span>{{ formatMessage(messages.browseServers) }}</span>
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
</EmptyState>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { CompassIcon, FilterIcon, PlusIcon, RefreshCwIcon, SearchIcon } from '@modrinth/assets'
|
||||
@@ -171,14 +169,11 @@ import {
|
||||
GAME_MODES,
|
||||
type GameVersion,
|
||||
injectNotificationManager,
|
||||
ReadyTransition,
|
||||
StyledInput,
|
||||
useReadyState,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useQuery, useQueryClient } from '@tanstack/vue-query'
|
||||
import { platform } from '@tauri-apps/plugin-os'
|
||||
import { computed, onBeforeUnmount, ref, watch } from 'vue'
|
||||
import { computed, onUnmounted, ref, watch } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
|
||||
import type ContextMenu from '@/components/ui/ContextMenu.vue'
|
||||
@@ -349,21 +344,11 @@ function toggleFilter(id: string) {
|
||||
}
|
||||
}
|
||||
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
const refreshingAll = ref(false)
|
||||
const hadNoWorlds = ref(true)
|
||||
const startingInstance = ref(false)
|
||||
const worldPlaying = ref<World>()
|
||||
|
||||
const worldsQuery = useQuery({
|
||||
queryKey: computed(() => ['worlds', instance.value.path]),
|
||||
queryFn: () => refreshWorlds(instance.value.path),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
|
||||
const worldsReadyPending = useReadyState(worldsQuery)
|
||||
|
||||
const worlds = ref<World[]>([])
|
||||
const serverData = ref<Record<string, ServerData>>({})
|
||||
|
||||
@@ -373,26 +358,6 @@ const isLinux = platform() === 'linux'
|
||||
const linuxRefreshCount = ref(0)
|
||||
|
||||
const protocolVersion = ref<ProtocolVersion | null>(null)
|
||||
|
||||
const gameVersions = ref<GameVersion[]>([])
|
||||
const supportsServerQuickPlay = computed(() =>
|
||||
hasServerQuickPlaySupport(gameVersions.value, instance.value.game_version),
|
||||
)
|
||||
const supportsWorldQuickPlay = computed(() =>
|
||||
hasWorldQuickPlaySupport(gameVersions.value, instance.value.game_version),
|
||||
)
|
||||
|
||||
watch(
|
||||
() => worldsQuery.data.value,
|
||||
(data) => {
|
||||
if (data) {
|
||||
worlds.value = [...data]
|
||||
refreshServers(worlds.value, serverData.value, protocolVersion.value)
|
||||
hadNoWorlds.value = worlds.value.length === 0
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
const managedServerName = ref<string | null>(null)
|
||||
const managedServerAddress = ref<string | null>(null)
|
||||
|
||||
@@ -420,8 +385,8 @@ async function refreshManagedServerMetadata() {
|
||||
|
||||
try {
|
||||
const [project, projectV3] = await Promise.all([
|
||||
get_project(projectId),
|
||||
get_project_v3(projectId),
|
||||
get_project(projectId, 'bypass'),
|
||||
get_project_v3(projectId, 'bypass'),
|
||||
])
|
||||
|
||||
if (projectV3?.minecraft_server == null) {
|
||||
@@ -457,40 +422,27 @@ watch(
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
let unlistenProfile: (() => void) | null = null
|
||||
let worldsTabAlive = true
|
||||
const [unlistenProfile, , resolvedProtocolVersion, resolvedGameVersions] = await Promise.all([
|
||||
profile_listener(async (e: ProfileEvent) => {
|
||||
if (e.profile_path_id !== instance.value.path) return
|
||||
|
||||
async function initWorldsTab() {
|
||||
const [_unlistenProfile, resolvedProtocolVersion, resolvedGameVersions] = await Promise.all([
|
||||
profile_listener(async (e: ProfileEvent) => {
|
||||
if (e.profile_path_id !== instance.value.path) return
|
||||
console.info(`Handling profile event '${e.event}' for profile: ${e.profile_path_id}`)
|
||||
|
||||
console.info(`Handling profile event '${e.event}' for profile: ${e.profile_path_id}`)
|
||||
if (e.event === 'servers_updated') {
|
||||
if (isLinux && linuxRefreshCount.value >= MAX_LINUX_REFRESHES) return
|
||||
if (isLinux) linuxRefreshCount.value++
|
||||
|
||||
if (e.event === 'servers_updated') {
|
||||
if (isLinux && linuxRefreshCount.value >= MAX_LINUX_REFRESHES) return
|
||||
if (isLinux) linuxRefreshCount.value++
|
||||
await refreshAllWorlds()
|
||||
}
|
||||
|
||||
await refreshAllWorlds()
|
||||
}
|
||||
await handleDefaultProfileUpdateEvent(worlds.value, instance.value.path, e)
|
||||
}),
|
||||
refreshAllWorlds(),
|
||||
get_profile_protocol_version(instance.value.path).catch(() => null),
|
||||
get_game_versions().catch(() => [] as GameVersion[]),
|
||||
])
|
||||
|
||||
await handleDefaultProfileUpdateEvent(worlds.value, instance.value.path, e)
|
||||
}),
|
||||
get_profile_protocol_version(instance.value.path).catch(() => null),
|
||||
get_game_versions().catch(() => [] as GameVersion[]),
|
||||
])
|
||||
|
||||
if (!worldsTabAlive) {
|
||||
_unlistenProfile()
|
||||
return
|
||||
}
|
||||
|
||||
unlistenProfile = _unlistenProfile
|
||||
protocolVersion.value = resolvedProtocolVersion
|
||||
gameVersions.value = resolvedGameVersions
|
||||
}
|
||||
|
||||
await initWorldsTab()
|
||||
protocolVersion.value = resolvedProtocolVersion
|
||||
|
||||
async function refreshServer(address: string) {
|
||||
if (!serverData.value[address]) {
|
||||
@@ -506,10 +458,26 @@ async function refreshAllWorlds() {
|
||||
console.log(`Already refreshing, cancelling refresh.`)
|
||||
return
|
||||
}
|
||||
await refreshManagedServerMetadata()
|
||||
|
||||
refreshingAll.value = true
|
||||
await queryClient.invalidateQueries({ queryKey: ['worlds', instance.value.path] })
|
||||
refreshingAll.value = false
|
||||
|
||||
worlds.value = await refreshWorlds(instance.value.path).finally(
|
||||
() => (refreshingAll.value = false),
|
||||
)
|
||||
refreshServers(worlds.value, serverData.value, protocolVersion.value)
|
||||
|
||||
const hasNoWorlds = worlds.value.length === 0
|
||||
|
||||
if (hadNoWorlds.value && hasNoWorlds) {
|
||||
setTimeout(() => {
|
||||
refreshingAll.value = false
|
||||
}, 1000)
|
||||
} else {
|
||||
refreshingAll.value = false
|
||||
}
|
||||
|
||||
hadNoWorlds.value = hasNoWorlds
|
||||
}
|
||||
|
||||
async function addServer(server: ServerWorld) {
|
||||
@@ -624,6 +592,14 @@ function worldsMatch(world: World, other: World | undefined) {
|
||||
return false
|
||||
}
|
||||
|
||||
const gameVersions = ref<GameVersion[]>(resolvedGameVersions)
|
||||
const supportsServerQuickPlay = computed(() =>
|
||||
hasServerQuickPlaySupport(gameVersions.value, instance.value.game_version),
|
||||
)
|
||||
const supportsWorldQuickPlay = computed(() =>
|
||||
hasWorldQuickPlaySupport(gameVersions.value, instance.value.game_version),
|
||||
)
|
||||
|
||||
const dedupedWorlds = computed(() => {
|
||||
const visibleWorlds: World[] = []
|
||||
const serverIndexByDomain = new Map<string, number>()
|
||||
@@ -773,8 +749,7 @@ async function proceedDeleteWorld() {
|
||||
worldToDelete.value = undefined
|
||||
}
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
worldsTabAlive = false
|
||||
unlistenProfile?.()
|
||||
onUnmounted(() => {
|
||||
unlistenProfile()
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
import type { LoadingStateProvider } from '@modrinth/ui'
|
||||
import { createLoadingStateCore, provideLoadingState } from '@modrinth/ui'
|
||||
|
||||
/**
|
||||
* Source of truth for the desktop app's loading state.
|
||||
*
|
||||
* Owns the token-based ref-counter directly (no Pinia store). Consumers
|
||||
* obtain the same reactive state via `injectLoadingState()` from `@modrinth/ui`.
|
||||
*
|
||||
* Returns the provider so the call site (App.vue) can also use it directly
|
||||
* without a second injection round-trip.
|
||||
*/
|
||||
export function setupLoadingStateProvider(): LoadingStateProvider {
|
||||
const provider = createLoadingStateCore({ barEnabled: false })
|
||||
provideLoadingState(provider)
|
||||
return provider
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import { defineStore } from 'pinia'
|
||||
|
||||
export const useLoading = defineStore('loadingStore', {
|
||||
state: () => ({
|
||||
loading: false,
|
||||
barEnabled: false,
|
||||
}),
|
||||
actions: {
|
||||
setEnabled(enabled) {
|
||||
this.barEnabled = enabled
|
||||
},
|
||||
startLoading() {
|
||||
this.loading = true
|
||||
},
|
||||
stopLoading() {
|
||||
this.loading = false
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -1,4 +1,5 @@
|
||||
import { useBreadcrumbs } from './breadcrumbs'
|
||||
import { useLoading } from './loading'
|
||||
import { useTheming } from './theme.ts'
|
||||
|
||||
export { useBreadcrumbs, useTheming }
|
||||
export { useBreadcrumbs, useLoading, useTheming }
|
||||
|
||||
@@ -26,9 +26,7 @@
|
||||
{ "url": "https://modrinth.com/*" },
|
||||
{ "url": "https://*.modrinth.com/*" },
|
||||
{ "url": "https://*.nodes.modrinth.com/*" },
|
||||
{ "url": "https://api.mclo.gs/*" },
|
||||
{ "url": "https://fill.papermc.io/*" },
|
||||
{ "url": "https://api.purpurmc.org/*" }
|
||||
{ "url": "https://api.mclo.gs/*" }
|
||||
]
|
||||
},
|
||||
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
"capabilities": ["ads", "core", "plugins"],
|
||||
"csp": {
|
||||
"default-src": "'self' customprotocol: asset:",
|
||||
"connect-src": "ipc: http://ipc.localhost https://modrinth.com https://*.modrinth.com https://*.nodes.modrinth.com https://*.posthog.com https://posthog.modrinth.com https://*.sentry.io https://api.mclo.gs http://textures.minecraft.net https://textures.minecraft.net https://js.stripe.com https://*.stripe.com wss://*.stripe.com wss://*.nodes.modrinth.com wss://*.ts.net https://fill.papermc.io https://api.purpurmc.org 'self' data: blob:",
|
||||
"connect-src": "ipc: http://ipc.localhost https://modrinth.com https://*.modrinth.com https://*.nodes.modrinth.com https://*.posthog.com https://posthog.modrinth.com https://*.sentry.io https://api.mclo.gs http://textures.minecraft.net https://textures.minecraft.net https://js.stripe.com https://*.stripe.com wss://*.stripe.com wss://*.nodes.modrinth.com wss://*.ts.net 'self' data: blob:",
|
||||
"font-src": ["https://cdn-raw.modrinth.com/fonts/"],
|
||||
"img-src": "https: 'unsafe-inline' 'self' asset: http://asset.localhost http://textures.minecraft.net blob: data:",
|
||||
"style-src": "'unsafe-inline' 'self'",
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
<template>
|
||||
<NuxtLayout>
|
||||
<NuxtRouteAnnouncer />
|
||||
<LoadingBar />
|
||||
<ModrinthLoadingIndicator />
|
||||
<NotificationPanel />
|
||||
<I18nDebugPanel />
|
||||
<NuxtPage />
|
||||
</NuxtLayout>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { I18nDebugPanel, LoadingBar, NotificationPanel } from '@modrinth/ui'
|
||||
import { I18nDebugPanel, NotificationPanel } from '@modrinth/ui'
|
||||
|
||||
import ModrinthLoadingIndicator from '~/components/ui/modrinth-loading-indicator.ts'
|
||||
import { setupProviders } from '~/providers/setup.ts'
|
||||
|
||||
const auth = await useAuth()
|
||||
|
||||
@@ -1,12 +1,4 @@
|
||||
<template>
|
||||
<NavTabs
|
||||
v-if="editingVersion"
|
||||
mode="local"
|
||||
:links="editTabLinks"
|
||||
:active-index="2"
|
||||
class="mb-4 border border-solid border-surface-5 shadow-none drop-shadow-none"
|
||||
@tab-click="setEditTab"
|
||||
/>
|
||||
<div class="flex w-full flex-col gap-4">
|
||||
<template
|
||||
v-if="handlingNewFiles || !(filesToAdd.length || draftVersion.existing_files?.length)"
|
||||
@@ -99,7 +91,6 @@ import {
|
||||
defineMessages,
|
||||
DropzoneFileInput,
|
||||
injectProjectPageContext,
|
||||
NavTabs,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { acceptFileFromProjectType } from '@modrinth/utils'
|
||||
@@ -119,25 +110,10 @@ const {
|
||||
swapPrimaryFile,
|
||||
replacePrimaryFile,
|
||||
editingVersion,
|
||||
modal,
|
||||
primaryFile,
|
||||
handleNewFiles,
|
||||
} = injectManageVersionContext()
|
||||
|
||||
const editTabs = [
|
||||
{ label: 'Metadata', href: 'metadata', stage: 'metadata' },
|
||||
{ label: 'Details', href: 'details', stage: 'add-details' },
|
||||
{ label: 'Files', href: 'files', stage: 'add-files' },
|
||||
] as const
|
||||
|
||||
const editTabLinks = editTabs.map(({ label, href }) => ({ label, href }))
|
||||
|
||||
function setEditTab(index: number) {
|
||||
const tab = editTabs[index]
|
||||
if (!tab) return
|
||||
modal.value?.setStage(tab.stage)
|
||||
}
|
||||
|
||||
function handleRemoveFile(index: number) {
|
||||
filesToAdd.value.splice(index, 1)
|
||||
}
|
||||
|
||||
@@ -1,12 +1,4 @@
|
||||
<template>
|
||||
<NavTabs
|
||||
v-if="editingVersion"
|
||||
mode="local"
|
||||
:links="editTabLinks"
|
||||
:active-index="1"
|
||||
class="mb-4 border border-solid border-surface-5 shadow-none drop-shadow-none"
|
||||
@tab-click="setEditTab"
|
||||
/>
|
||||
<div class="flex w-full flex-col gap-6">
|
||||
<div class="flex flex-col gap-2">
|
||||
<span class="font-semibold text-contrast">
|
||||
@@ -61,26 +53,12 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { Chips, MarkdownEditor, NavTabs, StyledInput } from '@modrinth/ui'
|
||||
import { Chips, MarkdownEditor, StyledInput } from '@modrinth/ui'
|
||||
|
||||
import { useImageUpload } from '~/composables/image-upload.ts'
|
||||
import { injectManageVersionContext } from '~/providers/version/manage-version-modal'
|
||||
|
||||
const { draftVersion, isUploading, editingVersion, modal } = injectManageVersionContext()
|
||||
|
||||
const editTabs = [
|
||||
{ label: 'Metadata', href: 'metadata', stage: 'metadata' },
|
||||
{ label: 'Details', href: 'details', stage: 'add-details' },
|
||||
{ label: 'Files', href: 'files', stage: 'add-files' },
|
||||
] as const
|
||||
|
||||
const editTabLinks = editTabs.map(({ label, href }) => ({ label, href }))
|
||||
|
||||
function setEditTab(index: number) {
|
||||
const tab = editTabs[index]
|
||||
if (!tab) return
|
||||
modal.value?.setStage(tab.stage)
|
||||
}
|
||||
const { draftVersion, isUploading } = injectManageVersionContext()
|
||||
|
||||
async function onImageUpload(file: File) {
|
||||
const response = await useImageUpload(file, { context: 'version' })
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<template>
|
||||
<EnvironmentSelector v-model="draftVersion.environment" />
|
||||
<div class="sm:w-[512px]">
|
||||
<EnvironmentSelector v-model="draftVersion.environment" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
|
||||
@@ -1,12 +1,4 @@
|
||||
<template>
|
||||
<NavTabs
|
||||
v-if="editingVersion"
|
||||
mode="local"
|
||||
:links="editTabLinks"
|
||||
:active-index="0"
|
||||
class="mb-2 border border-solid border-surface-5 shadow-none drop-shadow-none"
|
||||
@tab-click="setEditTab"
|
||||
/>
|
||||
<div class="flex flex-col gap-6">
|
||||
<div v-if="!editingVersion" class="flex flex-col gap-1">
|
||||
<div class="flex items-center justify-between">
|
||||
@@ -210,7 +202,6 @@ import {
|
||||
ENVIRONMENTS_COPY,
|
||||
FormattedTag,
|
||||
injectProjectPageContext,
|
||||
NavTabs,
|
||||
TagItem,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
@@ -238,21 +229,6 @@ const { projectV2 } = injectProjectPageContext()
|
||||
|
||||
const generatedState = useGeneratedState()
|
||||
const loaders = computed(() => generatedState.value.loaders)
|
||||
|
||||
const editTabs = [
|
||||
{ label: 'Metadata', href: 'metadata', stage: 'metadata' },
|
||||
{ label: 'Details', href: 'details', stage: 'add-details' },
|
||||
{ label: 'Files', href: 'files', stage: 'add-files' },
|
||||
] as const
|
||||
|
||||
const editTabLinks = editTabs.map(({ label, href }) => ({ label, href }))
|
||||
|
||||
function setEditTab(index: number) {
|
||||
const tab = editTabs[index]
|
||||
if (!tab) return
|
||||
modal.value?.setStage(tab.stage)
|
||||
}
|
||||
|
||||
const isModpack = computed(() => projectType.value === 'modpack')
|
||||
const isResourcePack = computed(
|
||||
() =>
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
class="w-min"
|
||||
@update:model-value="$emit('update:selectedCurrency', $event)"
|
||||
>
|
||||
<template #option="{ item }">
|
||||
<span class="font-semibold leading-tight">{{ item.label }}</span>
|
||||
<template v-for="option in currencyOptions" :key="option.value" #[`option-${option.value}`]>
|
||||
<span class="font-semibold leading-tight">{{ option.label }}</span>
|
||||
</template>
|
||||
</Combobox>
|
||||
<ButtonStyled>
|
||||
|
||||
+5
-5
@@ -75,16 +75,16 @@
|
||||
<span class="font-semibold leading-tight">{{ selectedRewardOption.label }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<template #option="{ item }">
|
||||
<template v-for="option in rewardOptions" :key="option.value" #[`option-${option.value}`]>
|
||||
<div class="flex items-center gap-2">
|
||||
<img
|
||||
v-if="item.imageUrl"
|
||||
:src="item.imageUrl"
|
||||
:alt="item.label"
|
||||
v-if="option.imageUrl"
|
||||
:src="option.imageUrl"
|
||||
:alt="option.label"
|
||||
class="size-5 rounded-full object-cover"
|
||||
loading="lazy"
|
||||
/>
|
||||
<span class="font-semibold leading-tight">{{ item.label }}</span>
|
||||
<span class="font-semibold leading-tight">{{ option.label }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</Combobox>
|
||||
|
||||
@@ -1,15 +1,5 @@
|
||||
<template>
|
||||
<KeybindsModal ref="keybindsModal" />
|
||||
<ConfirmModal
|
||||
v-if="lockStatus?.locked && !lockStatus?.isOwnLock"
|
||||
ref="takeOverModal"
|
||||
title="Override moderation lock"
|
||||
description="Are you sure you want to override?"
|
||||
:has-to-type="false"
|
||||
:markdown="false"
|
||||
proceed-label="Take over"
|
||||
@proceed="confirmTakeOverOverride"
|
||||
/>
|
||||
<div
|
||||
tabindex="0"
|
||||
class="moderation-checklist flex w-[600px] max-w-full flex-col rounded-2xl border-[1px] border-solid border-orange bg-bg-raised p-4 transition-all delay-200 duration-200 ease-in-out"
|
||||
@@ -70,7 +60,7 @@
|
||||
class="mt-4 flex grow justify-between gap-2 border-0 border-t-[1px] border-solid border-surface-5 pt-4"
|
||||
>
|
||||
<div class="flex items-center gap-2">
|
||||
<ButtonStyled @click="openTakeOverModal">
|
||||
<ButtonStyled v-if="lockStatus.expired" @click="retryAcquireLock">
|
||||
<button>
|
||||
<LockIcon aria-hidden="true" />
|
||||
Take over
|
||||
@@ -394,7 +384,13 @@
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
|
||||
<template v-for="opt in stageOptionsForSlots" #[opt.id] :key="opt.id">
|
||||
<template
|
||||
v-for="opt in stageOptions.filter(
|
||||
(opt) => 'id' in opt && 'text' in opt && 'icon' in opt,
|
||||
)"
|
||||
#[opt.id]
|
||||
:key="opt.id"
|
||||
>
|
||||
<component :is="opt.icon" v-if="opt.icon" class="mr-2" />
|
||||
{{ opt.text }}
|
||||
</template>
|
||||
@@ -470,7 +466,6 @@ import {
|
||||
ButtonStyled,
|
||||
Checkbox,
|
||||
Collapsible,
|
||||
ConfirmModal,
|
||||
DropdownSelect,
|
||||
injectNotificationManager,
|
||||
injectProjectPageContext,
|
||||
@@ -491,7 +486,6 @@ import { computedAsync, useDebounceFn, useLocalStorage } from '@vueuse/core'
|
||||
import { useGeneratedState } from '~/composables/generated'
|
||||
import { useImageUpload } from '~/composables/image-upload.ts'
|
||||
import { getProjectTypeForUrlShorthand } from '~/helpers/projects.js'
|
||||
import type { LockAcquireResponse } from '~/store/moderation.ts'
|
||||
import { useModerationStore } from '~/store/moderation.ts'
|
||||
|
||||
import KeybindsModal from './ChecklistKeybindsModal.vue'
|
||||
@@ -502,7 +496,6 @@ const { addNotification } = notifications
|
||||
const debug = useDebugLogger('ModerationChecklist')
|
||||
|
||||
const keybindsModal = ref<InstanceType<typeof KeybindsModal>>()
|
||||
const takeOverModal = ref<InstanceType<typeof ConfirmModal>>()
|
||||
|
||||
const props = defineProps<{
|
||||
collapsed: boolean
|
||||
@@ -518,7 +511,6 @@ const lockStatus = ref<{
|
||||
locked: boolean
|
||||
lockedBy?: { id: string; username: string; avatar_url?: string }
|
||||
lockedAt?: Date
|
||||
expiresAt?: Date
|
||||
expired?: boolean
|
||||
isOwnLock: boolean
|
||||
} | null>(null)
|
||||
@@ -544,15 +536,13 @@ const PREFETCH_STALE_MS = 30_000 // 30 seconds
|
||||
const PREFETCH_TARGET_COUNT = 3 // Keep 3 unlocked projects ready
|
||||
const PREFETCH_BATCH_SIZE = 5 // Check 5 at a time in parallel
|
||||
|
||||
async function handleVisibilityChange() {
|
||||
const LOCK_EXPIRY_MINUTES = 15
|
||||
|
||||
function handleVisibilityChange() {
|
||||
if (document.visibilityState === 'visible' && lockStatus.value?.isOwnLock) {
|
||||
// Immediately refresh the lock when returning to the tab
|
||||
// This handles cases where the heartbeat was throttled while backgrounded
|
||||
const refreshResult = await moderationStore.refreshLock()
|
||||
if (!refreshResult.success) {
|
||||
handleLockLost(refreshResult)
|
||||
return
|
||||
}
|
||||
moderationStore.refreshLock()
|
||||
// Refresh prefetch queue when tab becomes visible (not debounced)
|
||||
maintainPrefetchQueue()
|
||||
}
|
||||
@@ -565,9 +555,7 @@ function updateLockCountdown() {
|
||||
}
|
||||
|
||||
const lockedAt = new Date(lockStatus.value.lockedAt)
|
||||
const expiresAt = lockStatus.value.expiresAt
|
||||
? new Date(lockStatus.value.expiresAt)
|
||||
: new Date(lockedAt.getTime() + 15 * 60 * 1000)
|
||||
const expiresAt = new Date(lockedAt.getTime() + LOCK_EXPIRY_MINUTES * 60 * 1000)
|
||||
const now = new Date()
|
||||
const remainingMs = expiresAt.getTime() - now.getTime()
|
||||
|
||||
@@ -594,47 +582,12 @@ function clearLockCountdown() {
|
||||
function startLockHeartbeat() {
|
||||
lockCheckInterval.value = setInterval(
|
||||
async () => {
|
||||
const result = await moderationStore.refreshLock()
|
||||
if (!result.success) {
|
||||
handleLockLost(result)
|
||||
}
|
||||
await moderationStore.refreshLock()
|
||||
},
|
||||
5 * 60 * 1000,
|
||||
)
|
||||
}
|
||||
|
||||
function handleLockLost(result: LockAcquireResponse) {
|
||||
clearInterval(lockCheckInterval.value!)
|
||||
lockCheckInterval.value = null
|
||||
clearLockCountdown()
|
||||
|
||||
lockStatus.value = {
|
||||
locked: result.locked_by != null,
|
||||
lockedBy: result.locked_by,
|
||||
lockedAt: result.locked_at ? new Date(result.locked_at) : undefined,
|
||||
expiresAt: result.expires_at ? new Date(result.expires_at) : undefined,
|
||||
expired: result.expired,
|
||||
isOwnLock: false,
|
||||
}
|
||||
lockError.value = false
|
||||
|
||||
if (result.locked_by) {
|
||||
addNotification({
|
||||
title: 'Lock taken over',
|
||||
text: `@${result.locked_by.username} is now moderating this project.`,
|
||||
type: 'warning',
|
||||
})
|
||||
updateLockCountdown()
|
||||
lockCountdownInterval.value = setInterval(updateLockCountdown, 1000)
|
||||
} else {
|
||||
addNotification({
|
||||
title: 'Moderation lock lost',
|
||||
text: 'Your lock on this project has expired. Acquire the lock again to continue.',
|
||||
type: 'warning',
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function handleLockAcquired() {
|
||||
lockStatus.value = { locked: false, isOwnLock: true }
|
||||
lockError.value = false
|
||||
@@ -760,36 +713,28 @@ async function handleExit() {
|
||||
emit('exit')
|
||||
}
|
||||
|
||||
function openTakeOverModal() {
|
||||
takeOverModal.value?.show()
|
||||
}
|
||||
|
||||
async function confirmTakeOverOverride() {
|
||||
async function retryAcquireLock() {
|
||||
const projectId = projectV2.value?.id
|
||||
if (!projectId) {
|
||||
console.warn('[confirmTakeOverOverride] No project ID available')
|
||||
console.warn('[retryAcquireLock] No project ID available')
|
||||
return
|
||||
}
|
||||
const result = await moderationStore.overrideLock(projectId)
|
||||
const result = await moderationStore.acquireLock(projectId)
|
||||
|
||||
if (result.success) {
|
||||
addNotification({
|
||||
title: 'Moderation lock overridden',
|
||||
text: 'You are now moderating this project.',
|
||||
type: 'success',
|
||||
})
|
||||
handleLockAcquired()
|
||||
} else if (result.locked_by) {
|
||||
// Still locked by another moderator, update status
|
||||
lockStatus.value = {
|
||||
locked: true,
|
||||
lockedBy: result.locked_by,
|
||||
lockedAt: result.locked_at ? new Date(result.locked_at) : undefined,
|
||||
expiresAt: result.expires_at ? new Date(result.expires_at) : undefined,
|
||||
expired: result.expired,
|
||||
isOwnLock: false,
|
||||
}
|
||||
lockError.value = false
|
||||
|
||||
// Restart countdown timer
|
||||
updateLockCountdown()
|
||||
if (!lockCountdownInterval.value) {
|
||||
lockCountdownInterval.value = setInterval(updateLockCountdown, 1000)
|
||||
@@ -819,21 +764,25 @@ async function batchCheckLocksWithMetadata(
|
||||
projectIds: string[],
|
||||
): Promise<Map<string, LockCheckResult>> {
|
||||
const results = new Map<string, LockCheckResult>()
|
||||
const currentUserId = (auth.value?.user as { id?: string } | null)?.id
|
||||
|
||||
// Check locks and fetch minimal project data in parallel
|
||||
const checks = await Promise.allSettled(
|
||||
projectIds.map(async (id) => {
|
||||
// Parallel: check lock AND fetch project metadata
|
||||
const [lockResponse, projectData] = await Promise.all([
|
||||
const [lockStatus, projectData] = await Promise.all([
|
||||
moderationStore.checkLock(id),
|
||||
useBaseFetch(`project/${id}`, { method: 'GET' }).catch(() => null),
|
||||
])
|
||||
|
||||
// Check if lock is by the current user (own lock = can acquire)
|
||||
const isOwnLock = lockStatus.locked_by?.id === currentUserId
|
||||
|
||||
return {
|
||||
id,
|
||||
locked: lockResponse.locked,
|
||||
expired: lockResponse.expired,
|
||||
isOwnLock: lockResponse.is_own_lock,
|
||||
locked: lockStatus.locked,
|
||||
expired: lockStatus.expired,
|
||||
isOwnLock,
|
||||
slug: (projectData as { slug?: string })?.slug,
|
||||
projectType: (projectData as { project_type?: string })?.project_type,
|
||||
}
|
||||
@@ -1238,7 +1187,6 @@ watch(currentStage, () => {
|
||||
|
||||
onMounted(async () => {
|
||||
window.addEventListener('keydown', handleKeybinds)
|
||||
window.addEventListener('beforeunload', handleBeforeUnload)
|
||||
document.addEventListener('visibilitychange', handleVisibilityChange)
|
||||
notifications.setNotificationLocation('left')
|
||||
|
||||
@@ -1272,7 +1220,6 @@ onMounted(async () => {
|
||||
locked: true,
|
||||
lockedBy: result.locked_by,
|
||||
lockedAt: result.locked_at ? new Date(result.locked_at) : undefined,
|
||||
expiresAt: result.expires_at ? new Date(result.expires_at) : undefined,
|
||||
expired: result.expired,
|
||||
isOwnLock: false,
|
||||
}
|
||||
@@ -1286,25 +1233,7 @@ onMounted(async () => {
|
||||
}
|
||||
})
|
||||
|
||||
function handleBeforeUnload() {
|
||||
const projectId = projectV2.value?.id
|
||||
if (!projectId || !lockStatus.value?.isOwnLock) return
|
||||
|
||||
const config = useRuntimeConfig()
|
||||
const base = config.public.apiBaseUrl.replace(/\/v\d\/?$/, '/_internal/')
|
||||
const token = (auth as unknown as { value?: { token?: string } }).value?.token
|
||||
if (!token) return
|
||||
|
||||
// sendBeacon is POST-only and cannot set Authorization. The internal POST /release endpoint
|
||||
// accepts the same token as text/plain (matches useBaseFetch's Authorization value).
|
||||
void navigator.sendBeacon(
|
||||
`${base}moderation/lock/${projectId}/release`,
|
||||
new Blob([token], { type: 'text/plain' }),
|
||||
)
|
||||
}
|
||||
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener('beforeunload', handleBeforeUnload)
|
||||
window.removeEventListener('keydown', handleKeybinds)
|
||||
document.removeEventListener('visibilitychange', handleVisibilityChange)
|
||||
notifications.setNotificationLocation('right')
|
||||
@@ -1314,12 +1243,6 @@ onUnmounted(() => {
|
||||
}
|
||||
clearLockCountdown()
|
||||
|
||||
// Release lock if we own it (navigation away without explicit exit)
|
||||
const projectId = projectV2.value?.id
|
||||
if (projectId && lockStatus.value?.isOwnLock) {
|
||||
moderationStore.releaseLock(projectId)
|
||||
}
|
||||
|
||||
// Clear prefetch state to prevent memory leaks
|
||||
prefetchQueue.value = []
|
||||
isPrefetching.value = false
|
||||
@@ -1968,10 +1891,9 @@ async function sendMessage(status: ProjectStatus) {
|
||||
|
||||
const willHaveNext = moderationStore.completeCurrentProject(projectId, 'completed')
|
||||
|
||||
await Promise.race([
|
||||
moderationStore.releaseLock(projectId),
|
||||
new Promise((r) => setTimeout(r, 2000)),
|
||||
])
|
||||
moderationStore.releaseLock(projectId).catch((err) => {
|
||||
console.warn('Failed to release lock:', err)
|
||||
})
|
||||
|
||||
// Set both states together - hasNextProject MUST be set before done
|
||||
// to avoid the race condition where done=true renders with hasNextProject=false
|
||||
@@ -2099,10 +2021,9 @@ async function skipCurrentProject() {
|
||||
return
|
||||
}
|
||||
|
||||
await Promise.race([
|
||||
moderationStore.releaseLock(projectId),
|
||||
new Promise((r) => setTimeout(r, 2000)),
|
||||
])
|
||||
moderationStore.releaseLock(projectId).catch((err) => {
|
||||
console.warn('Failed to release lock:', err)
|
||||
})
|
||||
|
||||
hasNextProject.value = moderationStore.completeCurrentProject(projectId, 'skipped')
|
||||
|
||||
@@ -2168,12 +2089,6 @@ const stageOptions = computed<OverflowMenuOption[]>(() => {
|
||||
|
||||
return options
|
||||
})
|
||||
|
||||
type StageOverflowSlotOption = OverflowMenuOption & { id: string; text: string }
|
||||
|
||||
const stageOptionsForSlots = computed(() =>
|
||||
stageOptions.value.filter((opt): opt is StageOverflowSlotOption => 'id' in opt && 'text' in opt),
|
||||
)
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
import { computed, defineComponent, h, onBeforeUnmount, ref, watch } from 'vue'
|
||||
|
||||
import { startLoading, stopLoading, useNuxtApp } from '#imports'
|
||||
|
||||
export default defineComponent({
|
||||
name: 'ModrinthLoadingIndicator',
|
||||
props: {
|
||||
throttle: {
|
||||
type: Number,
|
||||
default: 50,
|
||||
},
|
||||
duration: {
|
||||
type: Number,
|
||||
default: 500,
|
||||
},
|
||||
height: {
|
||||
type: Number,
|
||||
default: 3,
|
||||
},
|
||||
color: {
|
||||
type: [String, Boolean],
|
||||
default:
|
||||
'repeating-linear-gradient(to right, var(--color-green) 0%, var(--landing-green-label) 100%)',
|
||||
},
|
||||
},
|
||||
setup(props, { slots }) {
|
||||
const indicator = useLoadingIndicator({
|
||||
duration: props.duration,
|
||||
throttle: props.throttle,
|
||||
})
|
||||
|
||||
const nuxtApp = useNuxtApp()
|
||||
nuxtApp.hook('page:start', () => {
|
||||
startLoading()
|
||||
indicator.start()
|
||||
})
|
||||
nuxtApp.hook('page:finish', () => {
|
||||
stopLoading()
|
||||
indicator.finish()
|
||||
})
|
||||
onBeforeUnmount(() => indicator.clear)
|
||||
|
||||
const loading = useLoading()
|
||||
|
||||
watch(loading, (newValue) => {
|
||||
if (newValue) {
|
||||
indicator.start()
|
||||
} else {
|
||||
indicator.finish()
|
||||
}
|
||||
})
|
||||
|
||||
return () =>
|
||||
h(
|
||||
'div',
|
||||
{
|
||||
class: 'nuxt-loading-indicator',
|
||||
style: {
|
||||
position: 'fixed',
|
||||
top: 0,
|
||||
right: 0,
|
||||
left: 0,
|
||||
pointerEvents: 'none',
|
||||
width: `${indicator.progress.value}%`,
|
||||
height: `${props.height}px`,
|
||||
opacity: indicator.isLoading.value ? 1 : 0,
|
||||
background: props.color || undefined,
|
||||
backgroundSize: `${(100 / indicator.progress.value) * 100}% auto`,
|
||||
transition: 'width 0.1s, height 0.4s, opacity 0.4s',
|
||||
zIndex: 999999,
|
||||
},
|
||||
},
|
||||
slots,
|
||||
)
|
||||
},
|
||||
})
|
||||
|
||||
function useLoadingIndicator(opts: { duration: number; throttle: number }) {
|
||||
const progress = ref(0)
|
||||
const isLoading = ref(false)
|
||||
const step = computed(() => 10000 / opts.duration)
|
||||
|
||||
let _timer: any = null
|
||||
let _throttle: any = null
|
||||
|
||||
function start() {
|
||||
clear()
|
||||
progress.value = 0
|
||||
if (opts.throttle && import.meta.client) {
|
||||
_throttle = setTimeout(() => {
|
||||
isLoading.value = true
|
||||
_startTimer()
|
||||
}, opts.throttle)
|
||||
} else {
|
||||
isLoading.value = true
|
||||
_startTimer()
|
||||
}
|
||||
}
|
||||
function finish() {
|
||||
progress.value = 100
|
||||
_hide()
|
||||
}
|
||||
|
||||
function clear() {
|
||||
clearInterval(_timer)
|
||||
clearTimeout(_throttle)
|
||||
_timer = null
|
||||
_throttle = null
|
||||
}
|
||||
|
||||
function _increase(num: number) {
|
||||
progress.value = Math.min(100, progress.value + num)
|
||||
}
|
||||
|
||||
function _hide() {
|
||||
clear()
|
||||
if (import.meta.client) {
|
||||
setTimeout(() => {
|
||||
isLoading.value = false
|
||||
setTimeout(() => {
|
||||
progress.value = 0
|
||||
}, 400)
|
||||
}, 500)
|
||||
}
|
||||
}
|
||||
|
||||
function _startTimer() {
|
||||
if (import.meta.client) {
|
||||
_timer = setInterval(() => {
|
||||
_increase(step.value)
|
||||
}, 100)
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
progress,
|
||||
isLoading,
|
||||
start,
|
||||
finish,
|
||||
clear,
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<NuxtLayout>
|
||||
<LoadingBar />
|
||||
<ModrinthLoadingIndicator />
|
||||
<NotificationPanel />
|
||||
<div class="main experimental-styles-within">
|
||||
<div v-if="is404" class="error-graphic">
|
||||
@@ -55,7 +55,6 @@ import { SadRinthbot } from '@modrinth/assets'
|
||||
import {
|
||||
defineMessage,
|
||||
IntlFormatted,
|
||||
LoadingBar,
|
||||
normalizeChildren,
|
||||
NotificationPanel,
|
||||
provideModrinthClient,
|
||||
@@ -66,15 +65,14 @@ import {
|
||||
|
||||
import Logo404 from '~/assets/images/404.svg'
|
||||
|
||||
import ModrinthLoadingIndicator from './components/ui/modrinth-loading-indicator.ts'
|
||||
import { createModrinthClient } from './helpers/api.ts'
|
||||
import { FrontendNotificationManager } from './providers/frontend-notifications.ts'
|
||||
import { setupLoadingStateProvider } from './providers/setup/loading-state.ts'
|
||||
|
||||
const auth = await useAuth()
|
||||
const config = useRuntimeConfig()
|
||||
|
||||
provideNotificationManager(new FrontendNotificationManager())
|
||||
setupLoadingStateProvider()
|
||||
|
||||
const client = createModrinthClient(auth.value, {
|
||||
apiBaseUrl: config.public.apiBaseUrl.replace('/v2/', '/'),
|
||||
|
||||
@@ -1151,6 +1151,24 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Vælg imellem Vanilla, Fabric, Forge, Quilt og NeoForge. Hvis det er på Modrinth, det kan køre på din server."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Fejlede i at ændre modpack version"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Fejlede i at indlæse versioner"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Fejlede i at geninstallere modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Fejlede i at reparere server"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Fejlede i at gemme installation indstillinger"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Fejlede i at unlink modpack"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Ikke på lager"
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Wähle zwischen Vanilla, Fabric, Forge, Quilt und NeoForge. Was auf Modrinth ist, kann auf deinem Server laufen."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Änder der Modpackversion fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Versionen konnten nicht geladen werden"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Neuinstallation des Modpack fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Reparatur des Servers fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Server konnte nicht in den Onboarding-Zustand zurückgesetzt werden"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Speichern der Installationseinstellungen fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Entkoppeln von Modpack fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Loader} other {{loader}}}version"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Deine Server-Installation wurde repariert."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Reparatur abgeschlossen"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Server zurücksetzen"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Entfernt sämtliche daten von deinem Server, inklusive deiner Welten, Mods und Konfigurationsdateien. Sicherung bleiben und können wiederhergestellt werden."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Auf Onboarding zurücksetzen"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Dadurch wird der Server in den Onboarding-Zustand zurückgesetzt, sodass die Einrichtung erneut abgeschlossen werden kann. Möchtest du wirklich fortfahren?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Auf Onboarding zurücksetzen"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "Der Server wurde in den Onboarding-Ablauf zurückgesetzt."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Server auf Onboarding zurückgesetzt"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Supportoptionen"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Nicht verfügbar"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Mit Server synchronisieren"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Backup-Erstellung im gange"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Wiederherstellung aus Sicherung läuft"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Server wird installiert"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Inhalt wird synchronisiert"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Aktionen"
|
||||
},
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Vergangene Abbuchungen"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Läuft ab am {date}"
|
||||
},
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Fehler beim erneuten Abonnieren"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Falls der Server momentan pausiert ist, kann es bis zu 10 Minuten dauern, bis ein weiterer Zahlungsversuch unternommen wird."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Anfrage zum erneuten Abonnieren übermittelt"
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Wähle zwischen Vanilla, Fabric, Forge, Quilt und NeoForge. Was auf Modrinth ist, kann auf deinem Server laufen."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Änderung der Modpack-Version ist fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Versionen konnten nicht geladen werden"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Neuinstallation des Modpacks ist fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Reparatur des Servers fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Server konnte nicht in den Onboarding-Zustand zurückgesetzt werden"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Speichern der Installationseinstellungen ist fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Das Trennen vom Modpack ist fehlgeschlagen"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Loader} other {{loader}}}version"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Deine Server-Installation wurde repariert."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Reparatur abgeschlossen"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Server zurücksetzen"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Entfernt alle Daten auf deinem Server, einschließlich deiner Welten, Mods und Konfigurationsdateien. Die Sicherungen bleiben erhalten und können wiederhergestellt werden."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Auf Onboarding zurücksetzen"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Dadurch wird der Server in den Onboarding-Zustand zurückgesetzt, sodass die Einrichtung erneut abgeschlossen werden kann. Möchtest du wirklich fortfahren?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Auf Onboarding zurücksetzen"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "Der Server wurde in den Onboarding-Ablauf zurückgesetzt."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Server auf Onboarding zurückgesetzt"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Supportoptionen"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Nicht verfügbar"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Mit Server synchronisieren"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Sicherung wird erstellt"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Wiederherstellung aus Sicherung läuft"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Server wird installiert"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Inhalt wird synchronisiert"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Aktionen"
|
||||
},
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Vergangene Abbuchungen"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Läuft ab am {date}"
|
||||
},
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Fehler beim erneuten Abonnieren"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Falls der Server momentan pausiert ist, kann es bis zu 10 Minuten dauern, bis ein weiterer Zahlungsversuch unternommen wird."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Anfrage zum erneuten Abonnieren übermittelt"
|
||||
},
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
"message": "Opciones de descarga"
|
||||
},
|
||||
"app-marketing.download.terms": {
|
||||
"message": "Al descargar la Modrinth App, aceptas nuestros <terms-link>Términos</terms-link> y <privacy-link>Política de Privacidad</privacy-link>."
|
||||
"message": "Al descargar la aplicación Modrinth, acepta nuestros <terms-link>Términos</terms-link> y <privacy-link>Política de privacidad</privacy-link>."
|
||||
},
|
||||
"app-marketing.download.title": {
|
||||
"message": "Descargar la Modrinth App (Beta)"
|
||||
@@ -63,7 +63,7 @@
|
||||
"message": "MultiMC"
|
||||
},
|
||||
"app-marketing.features.importing.title": {
|
||||
"message": "Importación de perfiles"
|
||||
"message": "Importar perfiles"
|
||||
},
|
||||
"app-marketing.features.mod-management.actions": {
|
||||
"message": "Acciones"
|
||||
@@ -108,7 +108,7 @@
|
||||
"message": "% CPU"
|
||||
},
|
||||
"app-marketing.features.performance.description": {
|
||||
"message": "Modrinth app tiene un mejor rendimiento que muchos de los gestores de mods más populares, ¡usando solo 150 MB de RAM!"
|
||||
"message": "Modrinth App performs better than many of the leading mod managers, using just 150 MB of RAM!"
|
||||
},
|
||||
"app-marketing.features.performance.discord": {
|
||||
"message": "Discord"
|
||||
@@ -201,7 +201,7 @@
|
||||
"message": "Ocultar otros paquetes"
|
||||
},
|
||||
"app-marketing.not-recommended": {
|
||||
"message": "No te recomendamos usar estos a menos que sepas lo que estás haciendo."
|
||||
"message": "No recomendamos usar esos al menos que sepas lo que estas haciendo."
|
||||
},
|
||||
"app-marketing.show-other-packages": {
|
||||
"message": "Mostrar otros paquetes"
|
||||
@@ -321,7 +321,7 @@
|
||||
"message": "No pudimos verificar tu correo electrónico. Intenta reenviar el correo de verificación usando el botón a continuación."
|
||||
},
|
||||
"auth.verify-email.failed-verification.title": {
|
||||
"message": "Error al verificar el correo"
|
||||
"message": "Verificación de correo fallida"
|
||||
},
|
||||
"auth.verify-email.post-verification.description": {
|
||||
"message": "¡Tu correo ha sido verificado correctamente!"
|
||||
@@ -393,7 +393,7 @@
|
||||
"message": "Aún no hay proyectos en la colección"
|
||||
},
|
||||
"collection.label.projects-count": {
|
||||
"message": "{count, plural, =0 {Aún no hay proyectos} other {<stat>{count}</stat> {type}}}"
|
||||
"message": "{count, plural, =0 {No hay proyectos todavía} otros {<stat>{count}</stat> {type}}}"
|
||||
},
|
||||
"collection.label.updated-at": {
|
||||
"message": "Actualizado {ago}"
|
||||
@@ -576,7 +576,7 @@
|
||||
"message": "Crear nuevo"
|
||||
},
|
||||
"dashboard.collections.empty.get-started-hint": {
|
||||
"message": "¡Crea tu primera colección para comenzar!"
|
||||
"message": "Crea tu primera colección para comenzar!"
|
||||
},
|
||||
"dashboard.collections.empty.no-collections": {
|
||||
"message": "Aún no tienes ninguna colección"
|
||||
@@ -585,10 +585,10 @@
|
||||
"message": "Ninguna colección coincide con tu búsqueda"
|
||||
},
|
||||
"dashboard.collections.empty.no-match-hint": {
|
||||
"message": "Prueba ajustar tus filtros o términos de búsqueda."
|
||||
"message": "Prueba a ajustar tus filtros o términos de búsqueda."
|
||||
},
|
||||
"dashboard.collections.label.projects-count": {
|
||||
"message": "{count} {countPlural, plural, one {proyecto} other {proyectos}}"
|
||||
"message": "{count} {countPlural, plural, one {project} other {projects}}"
|
||||
},
|
||||
"dashboard.collections.label.search-input": {
|
||||
"message": "Busca en tus colecciones"
|
||||
@@ -666,7 +666,7 @@
|
||||
"message": "Una entidad comercial se refiere a una organización registrada, como una sociedad anónima, una sociedad colectiva o una sociedad de responsabilidad limitada."
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.kyc.entity-question": {
|
||||
"message": "¿Vas a retirar como individuo o como empresa?"
|
||||
"message": "¿Te vas a retirar como individuo o como empresa?"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.kyc.private-individual": {
|
||||
"message": "Particular"
|
||||
@@ -762,7 +762,7 @@
|
||||
"message": "Conecta tu cuenta de PayPal para recibir pagos directamente."
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.paypal-details.save-success": {
|
||||
"message": "¡Nombre de usuario de Venmo guardado correctamente!"
|
||||
"message": "¡Nombre de usuario de Venmo guardado con éxito!"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.paypal-details.sign-in-with-paypal": {
|
||||
"message": "Iniciar sesión con PayPal"
|
||||
@@ -945,7 +945,7 @@
|
||||
"message": "Cartera"
|
||||
},
|
||||
"dashboard.withdraw.error.account-not-linked.text": {
|
||||
"message": "Por favor, vincula tu cuenta de pago antes de retirar."
|
||||
"message": ""
|
||||
},
|
||||
"dashboard.withdraw.error.account-not-linked.title": {
|
||||
"message": "Cuenta no vinculada"
|
||||
@@ -993,10 +993,10 @@
|
||||
"message": "Monto demasiado bajo"
|
||||
},
|
||||
"dashboard.withdraw.error.paypal-country-mismatch.text": {
|
||||
"message": "Por favor, usa el método de transferencia de PayPal para tu region (USA o internacional)."
|
||||
"message": "Por favor, usa el metodo de transferencia de PayPal para tu region (USA o internacional)."
|
||||
},
|
||||
"dashboard.withdraw.error.paypal-country-mismatch.title": {
|
||||
"message": "La región de PayPal no coincide"
|
||||
"message": "La region de PayPal no coincide"
|
||||
},
|
||||
"dashboard.withdraw.error.tax-form.text": {
|
||||
"message": "Debes completar un formulario fiscal para poder enviar tu solicitud de retiro."
|
||||
@@ -1107,7 +1107,7 @@
|
||||
"message": "Paga Mensualmente"
|
||||
},
|
||||
"hosting-marketing.billing.quarterly": {
|
||||
"message": "Paga trimestralmente"
|
||||
"message": "Pagar trimestralmente"
|
||||
},
|
||||
"hosting-marketing.billing.save-with-quarterly": {
|
||||
"message": "¡Ahorra un 16% con la facturación trimestral!"
|
||||
@@ -1119,28 +1119,28 @@
|
||||
"message": "Paga Anualmente"
|
||||
},
|
||||
"hosting-marketing.faq.burst-threads": {
|
||||
"message": "¿Cómo funcionan los hilos de CPU con burst?"
|
||||
"message": "¿Cómo funcionan los hilos con ráfagas de CPU?"
|
||||
},
|
||||
"hosting-marketing.faq.burst-threads.answer": {
|
||||
"message": "Cuando tu servidor está bajo mucha carga, le damos acceso temporal a hilos de CPU adicionales para ayudar a mitigar picos de lag e inestabilidad. Esto ayuda a evitar que los TPS bajen de 20, asegurando la experiencia más fluida posible. Dado que estos hilos de CPU extra solo están disponibles por un corto periodo durante momentos de mucha carga, es posible que no aparezcan en informes de Spark u otras herramientas de perfilado."
|
||||
"message": "Cuando tu servidor está bajo una carga intensa, se le otorga temporalmente acceso a subprocesos adicionales de CPU para ayudar a reducir los picos de lag y la inestabilidad. Esto evita que el TPS baje de 20, garantizando la experiencia más fluida posible. Dado que estos subprocesos extra solo están disponibles brevemente durante períodos de alta carga, es posible que no aparezcan en los informes de Spark ni en otras herramientas de perfilado."
|
||||
},
|
||||
"hosting-marketing.faq.cpu-kind": {
|
||||
"message": "¿Qué tipo de CPU utilizan los servidores de Modrinth Hosting?"
|
||||
},
|
||||
"hosting-marketing.faq.cpu-kind.answer": {
|
||||
"message": "Los servidores de Modrinth Hosting funcionan con CPU equivalentes a AMD Ryzen 7900 y 7950X3D a más de 5 GHz, junto con memoria DDR5."
|
||||
"message": "Los servidores de Modrinth Hosting funcionan con CPU AMD Ryzen 7900 y 7950X3D equivalentes a más de 5 GHz, combinadas con memoria DDR5."
|
||||
},
|
||||
"hosting-marketing.faq.currency": {
|
||||
"message": "¿En qué moneda están los precios?"
|
||||
"message": "¿En que moneda están los precios?"
|
||||
},
|
||||
"hosting-marketing.faq.currency.answer": {
|
||||
"message": "Todos los precios están en dólares estadounidenses (USD)."
|
||||
},
|
||||
"hosting-marketing.faq.ddos-protection": {
|
||||
"message": "¿Los servidores de Modrinth Hosting tienen protección contra DDoS?"
|
||||
"message": "¿Los servidores de Modrinth Hosting tendrán protección contra DDoS?"
|
||||
},
|
||||
"hosting-marketing.faq.ddos-protection.answer": {
|
||||
"message": "Sí. Todos los servidores de Modrinth Hosting incluyen protección contra DDoS, con una capacidad de hasta 17 Tbps en algunas ubicaciones."
|
||||
"message": "Sí. Todos los servidores de Modrinth Hosting vienen con protección DDoS, con hasta 17 Tbps de capacidad en algunas ubicaciones."
|
||||
},
|
||||
"hosting-marketing.faq.heading": {
|
||||
"message": "Preguntas Frecuentes (FAQ)"
|
||||
@@ -1149,10 +1149,10 @@
|
||||
"message": "¿Qué tan rápidos son los servidores de Modrinth Hosting?"
|
||||
},
|
||||
"hosting-marketing.faq.how-fast.answer.one": {
|
||||
"message": "Los servidores de modrinth hosting están alojados en hardware muy moderno y de alto rendimiento, pero es difícil decir exactamente cómo eso se traducirá en la velocidad de tu servidor, ya que hay muchos factores que influyen, como los mods, data packs o plugins que uses, e incluso el comportamiento de los usuarios."
|
||||
"message": "Los servidores de Modrinth Hosting están alojados en hardware muy moderno y de alto rendimiento, pero es difícil decir exactamente cómo se traducirá eso en la velocidad de funcionamiento de tu servidor, ya que hay muchos factores que influyen en ello, como los mods, los paquetes de datos o los plugins que ejecutas en tu servidor, e incluso el comportamiento de los usuarios."
|
||||
},
|
||||
"hosting-marketing.faq.how-fast.answer.two": {
|
||||
"message": "La mayoría de los problemas de rendimiento suelen deberse a un modpack, mod, data pack o plugin mal optimizado que provoca lag en el servidor. Dado que nuestros servidores son de gama alta, no deberías tener muchos problemas siempre que elijas un plan adecuado para el contenido que estés usando en tu servidor."
|
||||
"message": "La mayoría de los problemas de rendimiento que surgen suelen deberse a un modpack, mod, paquete de datos o complemento no optimizado que provoca retrasos en el servidor. Dado que nuestros servidores son de gama muy alta, no deberías tener muchos problemas siempre que elijas un plan adecuado para el contenido que ejecutas en el servidor."
|
||||
},
|
||||
"hosting-marketing.faq.increase-storage": {
|
||||
"message": "¿Puedo aumentar el almacenamiento en mi servidor?"
|
||||
@@ -1173,13 +1173,13 @@
|
||||
"message": "Los servidores de Modrinth Hosting pueden ejecutar cualquier versión de Minecraft: Java Edition, incluidas las de prueba, a partir de la 1.2.5."
|
||||
},
|
||||
"hosting-marketing.faq.versions-loaders.answer.two": {
|
||||
"message": "También admitimos una amplia variedad de loaders de mods y plugins, incluyendo Fabric, Quilt, Forge y NeoForge para mods, así como Paper y Purpur para plugins. La disponibilidad depende de si el loader de mods o plugins es compatible con la versión de Minecraft seleccionada."
|
||||
"message": "También admitimos una amplia gama de mod loaders y plugin loaders, incluidos Fabric, Quilt, Forge y NeoForge para mods, así como Paper y Purpur para plugins. La disponibilidad depende de si el loader de mods o plugins es compatible con la versión seleccionada de Minecraft."
|
||||
},
|
||||
"hosting-marketing.get-started": {
|
||||
"message": "Comenzar"
|
||||
},
|
||||
"hosting-marketing.hero.button.manage-your-servers": {
|
||||
"message": "Gestiona tus servidores"
|
||||
"message": "Administra tus servidores"
|
||||
},
|
||||
"hosting-marketing.hero.button.start-a-new-server": {
|
||||
"message": "Inicia un nuevo servidor"
|
||||
@@ -1200,7 +1200,7 @@
|
||||
"message": "Añade tu propio dominio al servidor, reserva hasta 15 puertos para los mods que los requieran y mucho más."
|
||||
},
|
||||
"hosting-marketing.included.backups-included": {
|
||||
"message": "Reslpados incluidos"
|
||||
"message": "Copias de seguridad incluidas"
|
||||
},
|
||||
"hosting-marketing.included.backups-included.description": {
|
||||
"message": "Cada servidor incluye 15 copias de seguridad almacenadas de forma segura fuera de las instalaciones."
|
||||
@@ -1209,7 +1209,7 @@
|
||||
"message": "URL personalizada"
|
||||
},
|
||||
"hosting-marketing.included.custom-url.description": {
|
||||
"message": "Comparte tu servidor con una URL personalizada <contrast>modrinth.gg</contrast>."
|
||||
"message": "Comparte tu servidor con una URL personalizada <contrast>modrinth.gg</contrast>"
|
||||
},
|
||||
"hosting-marketing.included.description": {
|
||||
"message": "Cada servidor incluye un conjunto de funciones diseñadas para proporcionar una experiencia de alojamiento que solo Modrinth puede ofrecer."
|
||||
@@ -1227,19 +1227,19 @@
|
||||
"message": "Ayuda cuando la necesites"
|
||||
},
|
||||
"hosting-marketing.included.help.description": {
|
||||
"message": "Ponte en contacto con el equipo de Modrinth para obtener ayuda con tu servidor en cualquier momento."
|
||||
"message": "Póngase en contacto con el equipo de Modrinth para obtener ayuda con su servidor en cualquier momento."
|
||||
},
|
||||
"hosting-marketing.included.powerful-console": {
|
||||
"message": "Una consola potente, un gestor de propiedades del servidor y más"
|
||||
"message": "Una potente consola, un administrador de propiedades del servidor y mucho más"
|
||||
},
|
||||
"hosting-marketing.included.powerful-console.description": {
|
||||
"message": "Modrinth Hosting incluye potentes herramientas para gestionar tu servidor."
|
||||
"message": "Modrinth Hosting incluye potentes herramientas para gestionar su servidor."
|
||||
},
|
||||
"hosting-marketing.included.sftp-access": {
|
||||
"message": "Acceso SFTP"
|
||||
},
|
||||
"hosting-marketing.included.sftp-access.description": {
|
||||
"message": "Accede directamente a los archivos de su servidor con SFTP integrado en Modrinth Hosting."
|
||||
"message": "Acceda directamente a los archivos de su servidor con SFTP integrado en Modrinth Hosting."
|
||||
},
|
||||
"hosting-marketing.included.with-your-server": {
|
||||
"message": "Incluido con su servidor"
|
||||
@@ -1248,13 +1248,13 @@
|
||||
"message": "¿Sabes exactamente lo que necesitas?"
|
||||
},
|
||||
"hosting-marketing.medal.info": {
|
||||
"message": "Prueba un <orange>servidor de 3 GB</orange> gratis durante 5 días con tecnología de <orange>Medal</orange>"
|
||||
"message": "Pruebe un <orange>servidor de 3 GB</orange> gratis durante 5 días con la tecnología <orange>Medal</orange>"
|
||||
},
|
||||
"hosting-marketing.medal.learn-more": {
|
||||
"message": "Aprender más"
|
||||
},
|
||||
"hosting-marketing.medal.text-secondary": {
|
||||
"message": "Oferta por tiempo limitado. No se requiere tarjeta de crédito. Disponible para servidores en EE. UU."
|
||||
"message": "Oferta limitada. Sin necesidad de tarjeta de crédito. Disponible para servidores de EE. UU."
|
||||
},
|
||||
"hosting-marketing.pick-customized-plan": {
|
||||
"message": "Elige un plan personalizado con solo las especificaciones que necesites."
|
||||
@@ -1266,40 +1266,73 @@
|
||||
"message": "Gestiona todo en Modrinth"
|
||||
},
|
||||
"hosting-marketing.why.all-on-modrinth.description": {
|
||||
"message": "Tu servidor, mods, jugadores y más, todo en Modrinth. No necesitas cambiar entre plataformas."
|
||||
"message": "Tu servidor, mods, jugadores y mucho más están todos en Modrinth. No es necesario cambiar de plataforma."
|
||||
},
|
||||
"hosting-marketing.why.consistently-fast": {
|
||||
"message": "Siempre rápido"
|
||||
},
|
||||
"hosting-marketing.why.consistently-fast.description": {
|
||||
"message": "Nuestra infraestructura nunca se sobrecarga, lo que significa que cada servidor alojado en Modrinth siempre funciona a su máximo rendimiento."
|
||||
"message": "Nuestra infraestructura nunca se sobrecarga, lo que significa que cada servidor alojado en Modrinth siempre funciona a pleno rendimiento."
|
||||
},
|
||||
"hosting-marketing.why.description": {
|
||||
"message": "Elige entre miles de modpacks en Modrinth o crea el tuyo. Invita a tus amigos cuando estés listo para jugar."
|
||||
"message": "Elige entre los miles de paquetes de mods disponibles en Modrinth o crea el tuyo propio. Invita a tus amigos cuando estés listo para jugar."
|
||||
},
|
||||
"hosting-marketing.why.heading": {
|
||||
"message": "Encuentra un modpack. Ahora es un servidor."
|
||||
"message": "Busca un modpack. Ahora es un servidor."
|
||||
},
|
||||
"hosting-marketing.why.modern-reliable-hosting": {
|
||||
"message": "Experimenta un hosting moderno y confiable"
|
||||
"message": "Disfruta de un alojamiento moderno y fiable"
|
||||
},
|
||||
"hosting-marketing.why.modern-reliable-hosting.description": {
|
||||
"message": "Los servidores de Modrinth Hosting están alojados en <contrast>CPUs AMD de alto rendimiento con RAM DDR5</contrast> y funcionan con software personalizado, para que tu servidor funcione sin problemas."
|
||||
"message": "Los servidores de Modrinth Hosting están alojados en <contrast>Procesadores AMD de alto rendimiento con RAM DDR5</contrast>, y funcionan con software personalizado para garantizar el buen funcionamiento de su servidor."
|
||||
},
|
||||
"hosting-marketing.why.where-mods-are": {
|
||||
"message": "Juega donde están tus mods"
|
||||
},
|
||||
"hosting-marketing.why.where-mods-are.description": {
|
||||
"message": "Modrinth Hosting integra de manera fluida la instalación de mods y modpacks en tu servidor."
|
||||
"message": "Modrinth Hosting integra a la perfección el proceso de instalación de mods y modpacks en tu servidor."
|
||||
},
|
||||
"hosting-marketing.why.why-modrinth-hosting": {
|
||||
"message": "¿Por qué elegir Modrinth Hosting?"
|
||||
"message": "¿Por qué Modrinth Hosting?"
|
||||
},
|
||||
"hosting-marketing.why.your-favorite-mods": {
|
||||
"message": "Todos tus mods favoritos"
|
||||
},
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Elige entre Vanilla, Fabric, Forge, Quilt y NeoForge. Si está en Modrinth, puedes ejecutarlo en tu servidor."
|
||||
"message": "Elige entre Vanilla, Fabric, Forge, Quilt y NeoForge. Si está en Modrinth, puede ejecutarse en tu servidor."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "No se pudo cambiar la versión del modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "No se pudo cargar las versiones"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "No se pudo reinstalar el modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "No se pudo reparar el servidor"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "No se pudo guardar la configuración de la instalación"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "No se pudo desvincular el modpack"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Loader} otra versión {{loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "La instalación de tu servidor ha sido reparada."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Reparación completada"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Resetear server"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Elimina todos los datos de tu servidor, incluidos tus mundos, mods y archivos de configuración. Los backups se mantendrán y podrán restaurarse."
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Agotado"
|
||||
@@ -1326,25 +1359,25 @@
|
||||
"message": "Datos y estadísticas"
|
||||
},
|
||||
"landing.creator.feature.discovery.description": {
|
||||
"message": "¡Haz que miles de usuarios descubran tu proyecto mediante búsquedas, nuestra página de inicio, el servidor de Discord y otras formas que llegarán en el futuro!"
|
||||
"message": "¡Haz que miles de usuarios descubran tu proyecto a través de las búsquedas, nuestra página de inicio y el servidor de Discord, y muchas otras formas más en el futuro!"
|
||||
},
|
||||
"landing.creator.feature.discovery.title": {
|
||||
"message": "Visibilidad"
|
||||
"message": "Descubrimiento"
|
||||
},
|
||||
"landing.creator.feature.diverse-ecosystem.description": {
|
||||
"message": "Integra tus herramientas de compilación con Minotaur para cargar automáticamente tu proyecto al publicar una nueva versión"
|
||||
"message": "Integra tus herramientas de compilación con Minotaur para subir versiones automáticamente al publicar una nueva versión"
|
||||
},
|
||||
"landing.creator.feature.diverse-ecosystem.title": {
|
||||
"message": "Ecosistema diverso"
|
||||
},
|
||||
"landing.creator.feature.monetization.description": {
|
||||
"message": "Recibe ingresos por anuncios en las páginas de tus proyectos y retira tus fondos en cualquier momento"
|
||||
"message": "Obtén ingresos por anuncios en las páginas de tus proyectos y retira tus fondos cuando quieras"
|
||||
},
|
||||
"landing.creator.feature.monetization.title": {
|
||||
"message": "Monetización"
|
||||
},
|
||||
"landing.creator.feature.team-management.description": {
|
||||
"message": "Invita a tu equipo y administra roles y permisos fácilmente"
|
||||
"message": "Invita a tus compañeros de equipo y administra roles y permisos con facilidad"
|
||||
},
|
||||
"landing.creator.feature.team-management.title": {
|
||||
"message": "Gestión de equipo"
|
||||
@@ -1353,7 +1386,7 @@
|
||||
"message": "Error al cargar proyectos aleatorios :("
|
||||
},
|
||||
"landing.feature.follow.description": {
|
||||
"message": "Recibe notificaciones cada vez que tus proyectos favoritos se actualicen y mantente al tanto."
|
||||
"message": "Recibe notificaciones cada vez que tus proyectos favoritos se actualicen y no te pierdas nada."
|
||||
},
|
||||
"landing.feature.follow.heading": {
|
||||
"message": "Sigue tus proyectos favoritos"
|
||||
@@ -2679,7 +2712,7 @@
|
||||
"message": "Escribir reportes"
|
||||
},
|
||||
"scopes.sessionAccess.description": {
|
||||
"message": "Acceder a sesiones emitidas por Modrinth"
|
||||
"message": "Acceder a las sesiones emitidas por Modrinth"
|
||||
},
|
||||
"scopes.sessionAccess.label": {
|
||||
"message": "Sesiones de acceso"
|
||||
@@ -2777,6 +2810,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Sincronizar con el servidor"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Creación de copia de seguridad en curso"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Restauración de copia de seguridad en curso"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "El servidor se está instalando"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Sincronización de contenido en progreso"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Acciones"
|
||||
},
|
||||
@@ -2814,7 +2859,7 @@
|
||||
"message": "Perfecto para 1–5 amigos con algunos mods ligeros."
|
||||
},
|
||||
"settings.account.button.complete-setup": {
|
||||
"message": "Finalizar configuración"
|
||||
"message": "Configuración completa"
|
||||
},
|
||||
"settings.account.data-export.action.download": {
|
||||
"message": "Descargar exportación"
|
||||
@@ -2826,13 +2871,13 @@
|
||||
"message": "Generando exportación..."
|
||||
},
|
||||
"settings.account.data-export.description": {
|
||||
"message": "Solicita una copia de todos los datos personales que has subido a Modrinth. Esto puede tardar varios minutos en completarse."
|
||||
"message": "Solicita una copia de todos los datos personales que hayas subido a Modrinth. El proceso puede tardar varios minutos en completarse."
|
||||
},
|
||||
"settings.account.data-export.title": {
|
||||
"message": "Exportación de datos"
|
||||
},
|
||||
"settings.account.delete.confirm.description": {
|
||||
"message": "Esto **eliminará inmediatamente todos tus datos de usuario y a quienes sigues**. Esto no eliminará tus proyectos. Eliminar tu cuenta no se puede deshacer.<br><br>Si necesitas ayuda con tu cuenta, obtén ayuda en el [Discord de Modrinth](https://discord.modrinth.com)."
|
||||
"message": "Esto **eliminará inmediatamente todos tus datos de usuario y tus seguidores**. No se eliminarán tus proyectos. La eliminación de tu cuenta es irreversible.<br><br>Si necesitas ayuda con tu cuenta, solicita asistencia en el [Discord de Modrinth](https://discord.modrinth.com)."
|
||||
},
|
||||
"settings.account.delete.confirm.proceed": {
|
||||
"message": "Eliminar esta cuenta"
|
||||
@@ -2844,13 +2889,13 @@
|
||||
"message": "Eliminar cuenta"
|
||||
},
|
||||
"settings.account.delete.section.description": {
|
||||
"message": "Una vez que elimines tu cuenta, no hay vuelta atrás. Eliminar tu cuenta borrará todos los datos asociados de nuestros servidores, excepto tus proyectos."
|
||||
"message": "Una vez que elimines tu cuenta, no habrá vuelta atrás. Al eliminar tu cuenta, se borrarán de nuestros servidores todos los datos asociados, excepto los proyectos."
|
||||
},
|
||||
"settings.account.delete.section.title": {
|
||||
"message": "Eliminar cuenta"
|
||||
},
|
||||
"settings.account.email.action.save": {
|
||||
"message": "Guardar correo"
|
||||
"message": "Guardar correo electrónico"
|
||||
},
|
||||
"settings.account.email.field.label": {
|
||||
"message": "Correo electrónico"
|
||||
@@ -2862,7 +2907,7 @@
|
||||
"message": "Añadir correo electrónico"
|
||||
},
|
||||
"settings.account.email.modal.header.change": {
|
||||
"message": "Cambiar correo"
|
||||
"message": "Cambiar correo electrónico"
|
||||
},
|
||||
"settings.account.email.modal.notice": {
|
||||
"message": "La información de tu cuenta no se muestra públicamente."
|
||||
@@ -2877,7 +2922,7 @@
|
||||
"message": "¡Las contraseñas no coinciden!"
|
||||
},
|
||||
"settings.account.password.field.confirm-current.description": {
|
||||
"message": "Por favor, introduce tu contraseña para continuar."
|
||||
"message": "Introduzca su contraseña para continuar."
|
||||
},
|
||||
"settings.account.password.field.confirm-current.label": {
|
||||
"message": "Confirmar contraseña"
|
||||
@@ -2898,10 +2943,10 @@
|
||||
"message": "Nueva contraseña"
|
||||
},
|
||||
"settings.account.password.field.old.label": {
|
||||
"message": "Contraseña actual"
|
||||
"message": "Antigua contraseña"
|
||||
},
|
||||
"settings.account.password.field.old.placeholder": {
|
||||
"message": "Contraseña actual"
|
||||
"message": "Antigua contraseña"
|
||||
},
|
||||
"settings.account.password.modal.header.add": {
|
||||
"message": "Añadir contraseña"
|
||||
@@ -2925,13 +2970,13 @@
|
||||
"message": "Proveedor"
|
||||
},
|
||||
"settings.account.security.email.action.add": {
|
||||
"message": "Añadir correo"
|
||||
"message": "Añadir correo electrónico"
|
||||
},
|
||||
"settings.account.security.email.action.change": {
|
||||
"message": "Cambiar correo"
|
||||
"message": "Cambiar correo electrónico"
|
||||
},
|
||||
"settings.account.security.email.description": {
|
||||
"message": "Cambia el correo electrónico asociado a tu cuenta."
|
||||
"message": "Cambia la dirección de correo electrónico asociada a tu cuenta."
|
||||
},
|
||||
"settings.account.security.email.title": {
|
||||
"message": "Correo electrónico"
|
||||
@@ -2943,13 +2988,13 @@
|
||||
"message": "Cambiar contraseña"
|
||||
},
|
||||
"settings.account.security.password.description.change": {
|
||||
"message": "Cambia la contraseña que usas para ingresar a tu cuenta."
|
||||
"message": "Cambia la contraseña que utilizas para iniciar sesión en tu cuenta."
|
||||
},
|
||||
"settings.account.security.password.description.change-or-remove": {
|
||||
"message": "Cambia o elimina la contraseña que usas para ingresar a tu cuenta."
|
||||
"message": "Cambia o elimina la contraseña que utilizas para iniciar sesión en tu cuenta."
|
||||
},
|
||||
"settings.account.security.password.description.set": {
|
||||
"message": "Establece una contraseña permanente para ingresar a tu cuenta."
|
||||
"message": "Establece una contraseña permanente para iniciar sesión en tu cuenta."
|
||||
},
|
||||
"settings.account.security.password.title": {
|
||||
"message": "Contraseña"
|
||||
@@ -2958,55 +3003,55 @@
|
||||
"message": "Gestionar proveedores"
|
||||
},
|
||||
"settings.account.security.providers.description": {
|
||||
"message": "Agrega o elimina métodos de inicio de sesión de tu cuenta, incluyendo GitHub, GitLab, Microsoft, Discord, Steam y Google."
|
||||
"message": "Añade o elimina métodos de inicio de sesión de tu cuenta, como GitHub, GitLab, Microsoft, Discord, Steam y Google."
|
||||
},
|
||||
"settings.account.security.providers.title": {
|
||||
"message": "Administrar proveedores de autenticación"
|
||||
"message": "Gestionar proveedores de autenticación"
|
||||
},
|
||||
"settings.account.security.title": {
|
||||
"message": "Seguridad de la cuenta"
|
||||
},
|
||||
"settings.account.security.two-factor.action.remove": {
|
||||
"message": "Eliminar verificación en dos pasos"
|
||||
"message": "Desactivar la autenticación de dos factores"
|
||||
},
|
||||
"settings.account.security.two-factor.action.setup": {
|
||||
"message": "Configurar verificación en dos pasos"
|
||||
"message": "Configurar la autenticación de dos factores"
|
||||
},
|
||||
"settings.account.security.two-factor.description": {
|
||||
"message": "Agrega una capa adicional de seguridad a tu cuenta al iniciar sesión."
|
||||
"message": "Añade una capa adicional de seguridad a tu cuenta al iniciar sesión."
|
||||
},
|
||||
"settings.account.security.two-factor.title": {
|
||||
"message": "Verificación en dos pasos"
|
||||
"message": "Autenticación de dos factores"
|
||||
},
|
||||
"settings.account.two-factor.backup.intro": {
|
||||
"message": "Descarga y guarda estos códigos de respaldo en un lugar seguro. ¡Puedes usarlos en lugar del código de verificación en dos pasos si pierdes acceso a tu dispositivo! Debes proteger estos códigos como si fueran tu contraseña."
|
||||
"message": "Descarga y guarda estos códigos de seguridad en un lugar seguro. ¡Puedes utilizarlos en lugar de un código de autenticación de dos factores si alguna vez pierdes el acceso a tu dispositivo! Debes proteger estos códigos igual que tu contraseña."
|
||||
},
|
||||
"settings.account.two-factor.backup.single-use": {
|
||||
"message": "Los códigos de respaldo solo se pueden usar una vez."
|
||||
"message": "Los códigos de seguridad solo se pueden usar una vez."
|
||||
},
|
||||
"settings.account.two-factor.error.incorrect-code": {
|
||||
"message": "¡El código introducido es incorrecto!"
|
||||
},
|
||||
"settings.account.two-factor.field.code.description": {
|
||||
"message": "Por favor, introduce un código de verificación en dos pasos para continuar."
|
||||
"message": "Introduce el código de autenticación de dos factores para continuar."
|
||||
},
|
||||
"settings.account.two-factor.field.code.label": {
|
||||
"message": "Introduce el código de verificación en dos pasos"
|
||||
"message": "Introduce el código de dos factores"
|
||||
},
|
||||
"settings.account.two-factor.field.code.placeholder": {
|
||||
"message": "Introduce el código..."
|
||||
},
|
||||
"settings.account.two-factor.setup.intro": {
|
||||
"message": "La verificación en dos pasos mantiene tu cuenta segura al requerir acceso a un segundo dispositivo para iniciar sesión."
|
||||
"message": "La autenticación de dos factores protege tu cuenta, ya que exige el acceso a un segundo dispositivo para iniciar sesión."
|
||||
},
|
||||
"settings.account.two-factor.setup.manual-secret": {
|
||||
"message": "Si el código QR no se puede escanear, puedes introducir el secreto manualmente:"
|
||||
"message": "Si no se puede escanear el código QR, puedes introducir el secreto manualmente:"
|
||||
},
|
||||
"settings.account.two-factor.setup.scan": {
|
||||
"message": "Escanea el código QR con <authy-link>Authy</authy-link>, <microsoft-authenticator-link>Microsoft Authenticator</microsoft-authenticator-link> o cualquier otra app de verificación en dos pasos para comenzar."
|
||||
"message": "Escanea el código QR con <authy-link>Authy</authy-link>, <microsoft-authenticator-link>Microsoft Authenticator</microsoft-authenticator-link> o cualquier otra aplicación de autenticación de dos factores para empezar."
|
||||
},
|
||||
"settings.account.two-factor.verify.description": {
|
||||
"message": "Introduce el código de un solo uso de la app de verificación para confirmar el acceso."
|
||||
"message": "Introduce el código de un solo uso de la aplicación de autenticación para verificar el acceso."
|
||||
},
|
||||
"settings.account.two-factor.verify.label": {
|
||||
"message": "Verificar código"
|
||||
@@ -3018,7 +3063,7 @@
|
||||
"message": "Añadir más"
|
||||
},
|
||||
"settings.applications.button.add-redirect-uri": {
|
||||
"message": "Agregar un URI de redirección"
|
||||
"message": "Añadir una URI de redirección"
|
||||
},
|
||||
"settings.applications.button.cancel": {
|
||||
"message": "Cancelar"
|
||||
@@ -3114,10 +3159,10 @@
|
||||
"message": "por"
|
||||
},
|
||||
"settings.authorizations.description": {
|
||||
"message": "Cuando autorizas una aplicación con tu cuenta de Modrinth, le concedes acceso a tu cuenta. Puedes gestionar y revisar los accesos a tu cuenta aquí en cualquier momento."
|
||||
"message": "Cuando autorizas una aplicación con tu cuenta de Modrinth, le concedes acceso a tu cuenta. Puedes gestionar y revisar el acceso a tu cuenta aquí en cualquier momento."
|
||||
},
|
||||
"settings.authorizations.empty-state": {
|
||||
"message": "Actualmente no podemos mostrar tus aplicaciones autorizadas. Estamos trabajando para solucionar esto. ¡Por favor, visita esta página más tarde!"
|
||||
"message": "Por el momento no podemos mostrar tus aplicaciones autorizadas, pero estamos trabajando para solucionar el problema. ¡Vuelve a visitar esta página más adelante!"
|
||||
},
|
||||
"settings.authorizations.head-title": {
|
||||
"message": "Autorizaciones"
|
||||
@@ -3126,16 +3171,16 @@
|
||||
"message": "Revocar"
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.description": {
|
||||
"message": "Esto revocará el acceso de la aplicación a tu cuenta. Siempre podrás autorizarla de nuevo más adelante."
|
||||
"message": "Esto revocará el acceso de la aplicación a tu cuenta. Siempre podrás volver a autorizarla más adelante."
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.title": {
|
||||
"message": "¿Estás seguro que quieres revocar esta aplicación?"
|
||||
"message": "¿Estás seguro de que quieres revocar esta solicitud?"
|
||||
},
|
||||
"settings.billing.charges.description": {
|
||||
"message": "Todos los cargos realizados a tu cuenta de Modrinth se mostrarán aquí:"
|
||||
"message": "Aquí aparecerán todos los cargos anteriores de tu cuenta de Modrinth:"
|
||||
},
|
||||
"settings.billing.charges.product.medal-trial": {
|
||||
"message": "Prueba del Medal Server"
|
||||
"message": "Versión de prueba de Medal Server"
|
||||
},
|
||||
"settings.billing.charges.product.midas": {
|
||||
"message": "Modrinth Plus"
|
||||
@@ -3143,11 +3188,8 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Cargos anteriores"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Expira {date}"
|
||||
"message": "Caduca el {date}"
|
||||
},
|
||||
"settings.billing.interval.month": {
|
||||
"message": "mes"
|
||||
@@ -3162,7 +3204,7 @@
|
||||
"message": "anual"
|
||||
},
|
||||
"settings.billing.midas.benefits.ad-free": {
|
||||
"message": "Navegación sin anuncios en modrinth.com y en la Modrinth App"
|
||||
"message": "Navegación sin anuncios en modrinth.com y Modrinth App"
|
||||
},
|
||||
"settings.billing.midas.benefits.badge": {
|
||||
"message": "Insignia de Modrinth+ en tu perfil"
|
||||
@@ -3174,25 +3216,25 @@
|
||||
"message": "Beneficios"
|
||||
},
|
||||
"settings.billing.midas.save-per-year": {
|
||||
"message": "¡Ahorra {amount}/año al cambiar a facturación anual!"
|
||||
"message": "¡Ahorra {amount} al año cambiando a la facturación anual!"
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line1": {
|
||||
"message": "Has cancelado tu suscripción."
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line2": {
|
||||
"message": "Conservarás tus beneficios hasta el final del ciclo de facturación actual."
|
||||
"message": "Conservarás tus ventajas hasta el final del ciclo de facturación actual."
|
||||
},
|
||||
"settings.billing.midas.status.failed": {
|
||||
"message": "El pago de tu suscripción falló. Por favor, actualiza tu método de pago."
|
||||
"message": "El pago de tu suscripción no se ha realizado correctamente. Actualiza tu método de pago."
|
||||
},
|
||||
"settings.billing.midas.status.open": {
|
||||
"message": "Actualmente estás suscrito a:"
|
||||
},
|
||||
"settings.billing.midas.status.processing": {
|
||||
"message": "Tu pago se está procesando. Los beneficios se activarán una vez que se complete el pago."
|
||||
"message": "Se está procesando tu pago. Las ventajas se activarán una vez que se haya completado el pago."
|
||||
},
|
||||
"settings.billing.midas.upsell": {
|
||||
"message": "¡Conviértete en suscriptor de Modrinth Plus!"
|
||||
"message": "¡Suscríbete a Modrinth Plus!"
|
||||
},
|
||||
"settings.billing.modal.cancel.action": {
|
||||
"message": "Cancelar subscripción"
|
||||
@@ -3216,7 +3258,7 @@
|
||||
"message": "Siguiente:"
|
||||
},
|
||||
"settings.billing.or-yearly-save": {
|
||||
"message": "O {price} / año (¡ahorra {percent}%!)"
|
||||
"message": "O {price} al año (¡ahorra un {percent}%!)"
|
||||
},
|
||||
"settings.billing.payment_method.action.add": {
|
||||
"message": "Agregar método de pago"
|
||||
@@ -3240,7 +3282,7 @@
|
||||
"message": "Métodos de pago"
|
||||
},
|
||||
"settings.billing.plan.title": {
|
||||
"message": "Plan {size}"
|
||||
"message": "{size} Plan"
|
||||
},
|
||||
"settings.billing.price.per-interval": {
|
||||
"message": "{price} / {interval}"
|
||||
@@ -3249,10 +3291,10 @@
|
||||
"message": "/{interval}"
|
||||
},
|
||||
"settings.billing.pyro.cpu": {
|
||||
"message": "{shared} CPUs compartidas (Picos de hasta {bursts} CPUs)"
|
||||
"message": "{shared} CPU compartidas (Picos de hasta {bursts} CPUs)"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.not-found": {
|
||||
"message": "No se pudo encontrar un servidor vinculado para esta suscripción. Hay algunas posibles explicaciones para esto. Si acabas de adquirir tu servidor, esto es normal: puede tardar hasta una hora en estar disponible. De lo contrario, si compraste este servidor hace tiempo, probablemente haya sido suspendido. Si esto no es lo que esperabas, por favor contacta al soporte de Modrinth proporcionando la siguiente información:"
|
||||
"message": "No se ha encontrado ningún servidor vinculado para esta suscripción. Hay varias explicaciones posibles para ello. Si acaba de adquirir su servidor, esto es normal. La configuración del servidor puede tardar hasta una hora. Por el contrario, si adquirió este servidor hace tiempo, es probable que haya sido suspendido desde entonces. Si esto no es lo que esperaba, póngase en contacto con el servicio de asistencia de Modrinth con la siguiente información:"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.server-id": {
|
||||
"message": "ID del servidor: {id}"
|
||||
@@ -3264,28 +3306,31 @@
|
||||
"message": "{gb} GB de RAM"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.text": {
|
||||
"message": "Ocurrió un error al renovar la suscripción de tu servidor de Modrinth."
|
||||
"message": "Se ha producido un error al volver a suscribirse a su servidor Modrinth."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Error al renovar la suscripción"
|
||||
"message": "Error al volver a suscribirse"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Si el servidor está actualmente suspendido, pueden pasar hasta 10 minutos antes de que se realice otro intento de cobro."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Solicitud de renovación de suscripción enviada"
|
||||
"message": "Solicitud de renovación enviada"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.success.text": {
|
||||
"message": "Suscripción del servidor renovada correctamente"
|
||||
"message": "La suscripción al servidor se ha renovado correctamente"
|
||||
},
|
||||
"settings.billing.pyro.status.failed": {
|
||||
"message": "El pago de tu suscripción falló. Por favor, actualiza tu método de pago y luego renueva la suscripción."
|
||||
"message": "El pago de tu suscripción no se ha realizado correctamente. Actualiza tu método de pago y vuelve a suscribirte."
|
||||
},
|
||||
"settings.billing.pyro.status.processing": {
|
||||
"message": "Tu pago se está procesando. Tu servidor se activará una vez que se complete el pago."
|
||||
"message": "Se está procesando tu pago. Tu servidor se activará una vez que se haya completado el pago."
|
||||
},
|
||||
"settings.billing.pyro.storage": {
|
||||
"message": "{gb} GB de SSD"
|
||||
},
|
||||
"settings.billing.pyro.swap": {
|
||||
"message": "{gb} GB Swap"
|
||||
"message": "{gb} GB de intercambio"
|
||||
},
|
||||
"settings.billing.pyro_subscription.description": {
|
||||
"message": "Gestiona tus suscripciones de Modrinth Servers."
|
||||
@@ -3297,13 +3342,13 @@
|
||||
"message": "Se renueva el {date}"
|
||||
},
|
||||
"settings.billing.resubscribe": {
|
||||
"message": "Renovar suscripción"
|
||||
"message": "Volver a suscribirse"
|
||||
},
|
||||
"settings.billing.since": {
|
||||
"message": "Desde el {date}"
|
||||
},
|
||||
"settings.billing.subscribe": {
|
||||
"message": "Suscribirse"
|
||||
"message": "Suscríbete"
|
||||
},
|
||||
"settings.billing.subscription.description": {
|
||||
"message": "Gestiona tus suscripciones de servidores Modrinth."
|
||||
@@ -3318,16 +3363,16 @@
|
||||
"message": "Cambiar a {interval}"
|
||||
},
|
||||
"settings.billing.switch.tooltip.monthly-additional-per-year": {
|
||||
"message": "La facturación mensual te costará {amount} adicionales por año"
|
||||
"message": "La facturación mensual te supondrá un coste adicional de {amount} al año"
|
||||
},
|
||||
"settings.billing.switches-to-billing-on": {
|
||||
"message": "Se cambia a facturación {interval} el {date}"
|
||||
"message": "Pasará a la facturación por {interval} a partir del {date}"
|
||||
},
|
||||
"settings.billing.update-method": {
|
||||
"message": "Actualizar método"
|
||||
},
|
||||
"settings.billing.upgrade": {
|
||||
"message": "Mejorar plan"
|
||||
"message": "Mejorar"
|
||||
},
|
||||
"settings.display.banner.developer-mode.button": {
|
||||
"message": "Desactivar modo desarrollador"
|
||||
@@ -3342,10 +3387,10 @@
|
||||
"message": "Activar/desactivar funciones"
|
||||
},
|
||||
"settings.display.notification.developer-mode-deactivated.text": {
|
||||
"message": "El modo desarrollador se ha desactivado"
|
||||
"message": "El modo de desarrollador se ha desactivado"
|
||||
},
|
||||
"settings.display.notification.developer-mode-deactivated.title": {
|
||||
"message": "Modo desarrollador desactivado"
|
||||
"message": "Modo de desarrollador desactivado"
|
||||
},
|
||||
"settings.display.project-list-layouts.datapack": {
|
||||
"message": "Página de Data Packs"
|
||||
@@ -3426,13 +3471,13 @@
|
||||
"message": "Color de la interfaz"
|
||||
},
|
||||
"settings.head-title": {
|
||||
"message": "Configuración de Visualización"
|
||||
"message": "Configuración de pantalla"
|
||||
},
|
||||
"settings.pats.action.create": {
|
||||
"message": "Crear un PAT"
|
||||
},
|
||||
"settings.pats.description": {
|
||||
"message": "Los PAT se pueden usar para acceder a la API de Modrinth. Pueden crearse y revocarse en cualquier momento. Para más información, consulta la <doc-link>documentación de la API de Modrinth</doc-link>."
|
||||
"message": "Se pueden usar PAT para acceder a la API de Modrinth. Se pueden crear y revocar en cualquier momento. Para más información, ver la <doc-link>documentación de la API de Modrinth</doc-link>."
|
||||
},
|
||||
"settings.pats.modal.create.action": {
|
||||
"message": "Crear un PAT"
|
||||
@@ -3528,7 +3573,7 @@
|
||||
"message": "Desarrollador"
|
||||
},
|
||||
"settings.sidebar.label.display": {
|
||||
"message": "Visualización"
|
||||
"message": "Pantalla"
|
||||
},
|
||||
"ui.latest-news-row.latest-news": {
|
||||
"message": "Últimas noticias de Modrinth"
|
||||
@@ -3537,13 +3582,13 @@
|
||||
"message": "Ver todas las noticias"
|
||||
},
|
||||
"ui.newsletter-button.subscribe": {
|
||||
"message": "Suscribirse"
|
||||
"message": "Suscribir"
|
||||
},
|
||||
"ui.newsletter-button.subscribed": {
|
||||
"message": "¡Suscrito!"
|
||||
},
|
||||
"ui.newsletter-button.tooltip": {
|
||||
"message": "Suscríbete a las noticias de Modrinth"
|
||||
"message": "Suscríbete al boletín de noticias de Modrinth"
|
||||
},
|
||||
"version.environment.none.description": {
|
||||
"message": "No se ha especificado el entorno para esta versión."
|
||||
|
||||
@@ -1301,6 +1301,39 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Elige entre Vanilla, Fabric, Forge, Quilt y NeoForge. Si está en Modrinth, pueden ejecutarse en tu servidor."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "No se pudo cambiar la versión del modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "No se pudieron cargar las versiones"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "No se pudo reinstalar el modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "No se pudo reparar el servidor"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "No se pudo guardar la configuración de instalación"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "No se pudo desvincular el modpack"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Cargador} other {{loader}}} versión"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "La instalación de su servidor ha sido reparada."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Reparación completada"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Reiniciar servidor"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Elimina todos los datos de su servidor, incluidos sus mundos, mods y archivos de configuración. Las copias de seguridad permanecerán y podrán restaurarse."
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Agotado"
|
||||
},
|
||||
@@ -2777,6 +2810,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Sincronizar con el servidor"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Creación de copia de seguridad en curso"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Restauración de copia de seguridad en curso"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "El servidor se está instalando"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Sincronización de contenido en progreso"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Acciones"
|
||||
},
|
||||
@@ -3143,9 +3188,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Cargos anteriores"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Caduca el {date}"
|
||||
},
|
||||
@@ -3269,6 +3311,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Error al volver a suscribirse"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Si el servidor está actualmente suspendido, pueden pasar hasta 10 minutos antes de que se realice otro intento de cobro."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Solicitud de renovación enviada"
|
||||
},
|
||||
|
||||
@@ -564,7 +564,7 @@
|
||||
"message": "Habam-buhay na babawiin ang affiliate code na `{id}` at ang lahat ng ibinahaging link sa code na ito ay magiging imbalido."
|
||||
},
|
||||
"dashboard.affiliate-links.revoke-confirm.button": {
|
||||
"message": "Bawiin"
|
||||
"message": "I-revoke"
|
||||
},
|
||||
"dashboard.affiliate-links.revoke-confirm.title": {
|
||||
"message": "Sigurado ka ba sa pagbabawi ng iyong affiliate link na \"{title}\"?"
|
||||
@@ -1301,6 +1301,9 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Mapa-Vanilla, mapa-Fabric, mapa-Forge, mapa-Quilt o mapa-NeoForge ba ang pili mo. Kung ito'y nasa Modrinth, gagana ito sa server mo."
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Bigong ma-unlink ang modpack"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Wala nang stock"
|
||||
},
|
||||
@@ -1326,7 +1329,7 @@
|
||||
"message": "Data and Statistics"
|
||||
},
|
||||
"landing.creator.feature.discovery.description": {
|
||||
"message": "Gawing madaling matuklas sa libo-libong tagagamit ang iyong proyekto gamit ang panghanap, sa aming pahina ng tahanan, sa Discord server, at sa iiba pang paraan sa darating na panahon!"
|
||||
"message": "Gawing madaling matuklas sa libo-libong tagagamit ang iyong proyekto gamit ang panghanap, sa aming home page, sa Discord server, at sa iiba pang paraan sa darating na panahon!"
|
||||
},
|
||||
"landing.creator.feature.discovery.title": {
|
||||
"message": "Pagtutuklas"
|
||||
@@ -1659,7 +1662,7 @@
|
||||
"message": "Kunin ang Modrinth App"
|
||||
},
|
||||
"layout.nav.home": {
|
||||
"message": "Tahanan"
|
||||
"message": "Home"
|
||||
},
|
||||
"layout.nav.host-a-server": {
|
||||
"message": "Mag-host ng server"
|
||||
@@ -1668,7 +1671,7 @@
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"layout.nav.modrinth-home-page": {
|
||||
"message": "Pahina ng tahanan ng Modrinth"
|
||||
"message": "Modrinth home page"
|
||||
},
|
||||
"layout.nav.my-servers": {
|
||||
"message": "Aking mga server"
|
||||
@@ -2235,7 +2238,7 @@
|
||||
"message": "Paglalarawan"
|
||||
},
|
||||
"project.details.licensed": {
|
||||
"message": "Lisensiyang"
|
||||
"message": "Linisensiya"
|
||||
},
|
||||
"project.download.game-version": {
|
||||
"message": "Bersiyon ng laro: {version}"
|
||||
@@ -2813,30 +2816,6 @@
|
||||
"servers.plan.small.description": {
|
||||
"message": "Nakaaangkop sa 1–5 manlalaro na may iilang mod."
|
||||
},
|
||||
"settings.account.email.modal.header.add": {
|
||||
"message": "Magdagdag ng email"
|
||||
},
|
||||
"settings.account.providers.action.add": {
|
||||
"message": "Idagdag"
|
||||
},
|
||||
"settings.account.providers.table.actions": {
|
||||
"message": "Aksiyon"
|
||||
},
|
||||
"settings.account.providers.table.provider": {
|
||||
"message": "Provider"
|
||||
},
|
||||
"settings.account.security.email.action.add": {
|
||||
"message": "Magdagdag ng email"
|
||||
},
|
||||
"settings.account.security.email.title": {
|
||||
"message": "Email"
|
||||
},
|
||||
"settings.account.security.password.title": {
|
||||
"message": "Password"
|
||||
},
|
||||
"settings.account.security.two-factor.action.setup": {
|
||||
"message": "Maghanda ng 2FA"
|
||||
},
|
||||
"settings.applications.about": {
|
||||
"message": "Tungkol"
|
||||
},
|
||||
@@ -2930,39 +2909,6 @@
|
||||
"settings.applications.secret.disclaimer": {
|
||||
"message": "I-save ang secret mo na, ito ay ililihid matapos mong umalis sa pahinang ito!"
|
||||
},
|
||||
"settings.authorizations.about-this-app": {
|
||||
"message": "Tungkol sa app"
|
||||
},
|
||||
"settings.authorizations.by": {
|
||||
"message": "ni/ng"
|
||||
},
|
||||
"settings.authorizations.empty-state": {
|
||||
"message": "Kasalukuyang hindi namin mapapakita ang mga pinahintulutang app, kinukumpuni pa namin ito. Mangyaring bisitahin ang pahinang ito sa ibang pagkataon!"
|
||||
},
|
||||
"settings.authorizations.head-title": {
|
||||
"message": "Mga Pagpapahintulot"
|
||||
},
|
||||
"settings.authorizations.revoke.action": {
|
||||
"message": "Bawiin"
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.description": {
|
||||
"message": "Babawiin nito ang akses ng aplikasyon sa iyong accunt. Maaari mo itong mapahintulutan muli."
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.title": {
|
||||
"message": "Sigurado ka ba sa pagbababwi ng aplikasyong ito?"
|
||||
},
|
||||
"settings.billing.interval.month": {
|
||||
"message": "buwan"
|
||||
},
|
||||
"settings.billing.interval.monthly": {
|
||||
"message": "buwanan"
|
||||
},
|
||||
"settings.billing.interval.year": {
|
||||
"message": "taon"
|
||||
},
|
||||
"settings.billing.interval.yearly": {
|
||||
"message": "taunan"
|
||||
},
|
||||
"settings.billing.modal.cancel.action": {
|
||||
"message": "Kanselahin ang iyong subscription"
|
||||
},
|
||||
@@ -2981,9 +2927,6 @@
|
||||
"settings.billing.modal.delete.title": {
|
||||
"message": "Sigurado ka bang gusto mong tanggalin itong paraan ng pagbabayad?"
|
||||
},
|
||||
"settings.billing.next": {
|
||||
"message": "Susunod:"
|
||||
},
|
||||
"settings.billing.payment_method.action.add": {
|
||||
"message": "Magdagdag ng paraan ng pagbabayad"
|
||||
},
|
||||
@@ -3011,18 +2954,12 @@
|
||||
"settings.billing.pyro_subscription.title": {
|
||||
"message": "Mga Modrinth Server Subscription"
|
||||
},
|
||||
"settings.billing.subscribe": {
|
||||
"message": "Mag-subscribe"
|
||||
},
|
||||
"settings.billing.subscription.description": {
|
||||
"message": "Pamahalaan ang iyong mga subscription sa Modrinth."
|
||||
},
|
||||
"settings.billing.subscription.title": {
|
||||
"message": "Mga subscription"
|
||||
},
|
||||
"settings.billing.upgrade": {
|
||||
"message": "Mag-upgrade"
|
||||
},
|
||||
"settings.display.banner.developer-mode.button": {
|
||||
"message": "Patayin ang developer mode"
|
||||
},
|
||||
@@ -3035,9 +2972,6 @@
|
||||
"settings.display.flags.title": {
|
||||
"message": "Pagtatakda ng tampok"
|
||||
},
|
||||
"settings.display.notification.developer-mode-deactivated.text": {
|
||||
"message": "Pinatay ang moda ng nagde-develop"
|
||||
},
|
||||
"settings.display.project-list-layouts.datapack": {
|
||||
"message": "Pahina ng Mga Data Pack"
|
||||
},
|
||||
@@ -3047,15 +2981,6 @@
|
||||
"settings.display.project-list-layouts.mod": {
|
||||
"message": "Pahina ng mga mod"
|
||||
},
|
||||
"settings.display.project-list-layouts.mode.gallery": {
|
||||
"message": "Galeriya"
|
||||
},
|
||||
"settings.display.project-list-layouts.mode.grid": {
|
||||
"message": "Parilya"
|
||||
},
|
||||
"settings.display.project-list-layouts.mode.rows": {
|
||||
"message": "Hilera"
|
||||
},
|
||||
"settings.display.project-list-layouts.modpack": {
|
||||
"message": "Pahina ng mga modpack"
|
||||
},
|
||||
@@ -3206,12 +3131,6 @@
|
||||
"settings.sessions.unknown-platform": {
|
||||
"message": "Hindi kilalang plataforma"
|
||||
},
|
||||
"settings.sidebar.label.account": {
|
||||
"message": "Account"
|
||||
},
|
||||
"settings.sidebar.label.display": {
|
||||
"message": "Display"
|
||||
},
|
||||
"ui.latest-news-row.latest-news": {
|
||||
"message": "Mga nagbabagang balita galing sa Modrinth"
|
||||
},
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
"message": "Moniteur d'activité"
|
||||
},
|
||||
"app-marketing.features.performance.cpu-percent": {
|
||||
"message": "Pourcentage du processeur"
|
||||
"message": "% CPU"
|
||||
},
|
||||
"app-marketing.features.performance.description": {
|
||||
"message": "Modrinth App est plus performante que la plupart des autres gestionnaires de mods, tout en n'utilisant que 150 Mo de RAM !"
|
||||
@@ -348,7 +348,7 @@
|
||||
"message": "Bienvenue"
|
||||
},
|
||||
"collection.button.edit-icon": {
|
||||
"message": "Modifier l'icône"
|
||||
"message": "Éditer l'icône"
|
||||
},
|
||||
"collection.button.remove-icon": {
|
||||
"message": "Supprimer l'icône"
|
||||
@@ -369,7 +369,7 @@
|
||||
"message": "Cela va supprimer de manière permanente cette collection. Cette action est irréversible."
|
||||
},
|
||||
"collection.delete-modal.title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir supprimer cette collection ?"
|
||||
"message": "Êtes-vous sûr de vouloir supprimer cette collection ?"
|
||||
},
|
||||
"collection.description": {
|
||||
"message": "{description} - Voir la collection {name} par {username} sur Modrinth"
|
||||
@@ -567,7 +567,7 @@
|
||||
"message": "Révoquer"
|
||||
},
|
||||
"dashboard.affiliate-links.revoke-confirm.title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir révoquer votre lien d'affiliation ''{title}'' ?"
|
||||
"message": "Êtes-vous sûr de vouloir révoquer votre lien d'affiliation ''{title}'' ?"
|
||||
},
|
||||
"dashboard.affiliate-links.search": {
|
||||
"message": "Rechercher des liens d'affiliation..."
|
||||
@@ -630,7 +630,7 @@
|
||||
"message": "Pratiques de sécurité"
|
||||
},
|
||||
"dashboard.creator-tax-form-modal.us-citizen.question": {
|
||||
"message": "Êtes-vous un.e citoyen(ne) des États-Unis d'Amérique ?"
|
||||
"message": "Êtes-vous un citoyen des États-Unis d'Amérique ?"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.complete-tax-form": {
|
||||
"message": "Remplissez le formulaire fiscal"
|
||||
@@ -1119,13 +1119,13 @@
|
||||
"message": "Payer annuellement"
|
||||
},
|
||||
"hosting-marketing.faq.burst-threads": {
|
||||
"message": "Comment les threads de rafale du processeur fonctionnent-ils ?"
|
||||
"message": "Comment les pics de puissance CPU fonctionnent-ils ?"
|
||||
},
|
||||
"hosting-marketing.faq.burst-threads.answer": {
|
||||
"message": "Lorsque votre serveur est fortement sollicité, nous lui accordons temporairement l'accès à des threads de processeur supplémentaires afin d'atténuer les pics de latence et l'instabilité. Cela permet d'éviter que le TPS ne descende en dessous de 20, garantissant ainsi une expérience aussi fluide que possible. Étant donné que ces threads de processeur supplémentaires ne sont disponibles que brièvement pendant les périodes de forte charge, ils peuvent ne pas apparaître dans les rapports Spark ou d'autres outils de profilage."
|
||||
"message": "Lorsque votre serveur est fortement sollicité, nous lui accordons temporairement l'accès à des threads CPU supplémentaires afin d'atténuer les pics de latence et l'instabilité. Cela permet d'éviter que le TPS ne descende en dessous de 20, garantissant ainsi une expérience aussi fluide que possible. Étant donné que ces threads CPU supplémentaires ne sont disponibles que brièvement pendant les périodes de forte charge, ils peuvent ne pas apparaître dans les rapports Spark ou d'autres outils de profilage."
|
||||
},
|
||||
"hosting-marketing.faq.cpu-kind": {
|
||||
"message": "Sur quelle sorte de processeurs Modrinth Hosting exécute-t-il les serveurs ?"
|
||||
"message": "Sur quelle sorte de CPU Modrinth Hosting exécute-t-il les serveurs ?"
|
||||
},
|
||||
"hosting-marketing.faq.cpu-kind.answer": {
|
||||
"message": "Les serveurs de Modrinth Hosting sont équipés de processeurs AMD Ryzen 7900 et 7950X3D équivalents cadencés à plus de 5 GHz, associés à une mémoire DDR5."
|
||||
@@ -1200,10 +1200,10 @@
|
||||
"message": "Ajoutez votre propre domaine à votre serveur, réservez jusqu'à 15 ports pour les mods qui en ont besoin, et plus encore."
|
||||
},
|
||||
"hosting-marketing.included.backups-included": {
|
||||
"message": "Sauvegardes y comprises"
|
||||
"message": "Sauvegardes de secours incluses"
|
||||
},
|
||||
"hosting-marketing.included.backups-included.description": {
|
||||
"message": "Chaque serveur est livré avec 15 sauvegardes stockées en toute sécurité hors site."
|
||||
"message": "Chaque serveur est livré avec 15 sauvegardes de secours stockées en toute sécurité hors site."
|
||||
},
|
||||
"hosting-marketing.included.custom-url": {
|
||||
"message": "URL personnalisée"
|
||||
@@ -1224,7 +1224,7 @@
|
||||
"message": "Tous les boutons dont vous rêvez."
|
||||
},
|
||||
"hosting-marketing.included.help": {
|
||||
"message": "Un coup de main à portée de main"
|
||||
"message": "De l'aide quand vous en avez besoin"
|
||||
},
|
||||
"hosting-marketing.included.help.description": {
|
||||
"message": "Contactez l'équipe Modrinth pour obtenir de l'aide avec votre serveur à tout moment."
|
||||
@@ -1284,7 +1284,7 @@
|
||||
"message": "Profitez d'un hébergement moderne et fiable"
|
||||
},
|
||||
"hosting-marketing.why.modern-reliable-hosting.description": {
|
||||
"message": "Les serveurs d'hébergement Modrinth sont hébergés sur des <contrast>processeurs AMD hautes performances avec une mémoire vive DDR5</contrast>, fonctionnant sur un logiciel sur mesure pour assurer le bon fonctionnement de votre serveur."
|
||||
"message": "Les serveurs d'hébergement Modrinth sont hébergés sur des <contrast>processeurs AMD hautes performances avec une RAM DDR5</contrast>, fonctionnant sur un logiciel sur mesure pour assurer le bon fonctionnement de votre serveur."
|
||||
},
|
||||
"hosting-marketing.why.where-mods-are": {
|
||||
"message": "Jouez là où se trouvent vos mods"
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Choisissez entre Vanilla, Fabric, Forge, Quilt et NeoForge. Tout le contenu de Modrinth est compatible avec votre serveur."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Impossible de changer la version du modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Impossible de charger les versions"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Impossible de réinstaller le modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Impossible de réparer le serveur"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Impossible de réinitialiser le serveur à l'intégration"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Impossible de sauvegarder les paramètres d'installation"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Impossible de délier le modpack"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Version} other {{version}}} du loader"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Votre installation serveur a été réparée."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Réparation terminée"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Réinitialiser le serveur"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Supprime définitivement toutes les données de votre serveur, y compris vos mondes, vos mods, et vos fichiers paramètres. Les sauvegardes resteront et pourront être restaurées."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Réinitialiser à l'intégration"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Cela enverra le serveur à l'intégration afin que la configuration puisse être terminée à nouveau. Êtes-vous sûr de vouloir continuer ?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Réinitialiser à l'intégration"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "Le serveur a été renvoyé au flux d'intégration."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Serveur réinitialisé à l'intégration"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Options de prise en charge"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "En rupture de stock"
|
||||
},
|
||||
@@ -1428,7 +1482,7 @@
|
||||
"message": "Partagez vos créations avec le monde"
|
||||
},
|
||||
"landing.section.for-players.description": {
|
||||
"message": "Des biomes magiques aux donjons maudits, vous pouvez être sûr.e de trouver ce que vous cherchez pour amener votre gameplay au niveau supérieur."
|
||||
"message": "Des biomes magiques aux donjons maudits, vous pouvez être sûr de trouver ce que vous cherchez pour amener votre gameplay au niveau supérieur."
|
||||
},
|
||||
"landing.section.for-players.label": {
|
||||
"message": "Pour les joueurs"
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Synchroniser avec le serveur"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Création d'une sauvegarde en cours"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Restauration de sauvegarde en cours"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Le serveur est en cours d'installation"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Synchronisation du contenu en cours"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Actions"
|
||||
},
|
||||
@@ -2838,7 +2904,7 @@
|
||||
"message": "Supprimer ce compte"
|
||||
},
|
||||
"settings.account.delete.confirm.title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir supprimer votre compte ?"
|
||||
"message": "Êtes-vous sûr de vouloir supprimer votre compte ?"
|
||||
},
|
||||
"settings.account.delete.section.action": {
|
||||
"message": "Supprimer le compte"
|
||||
@@ -3057,7 +3123,7 @@
|
||||
"message": "Vous êtes sur le point de supprimer cette application et retirer tous les jetons d'accès. (pour toujours !)"
|
||||
},
|
||||
"settings.applications.delete.confirm.title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir supprimer cette application ? "
|
||||
"message": "Êtes-vous sûr de vouloir supprimer cette application ? "
|
||||
},
|
||||
"settings.applications.description.intro": {
|
||||
"message": "Les applications permettent d'authentifier les utilisateurs de Modrinth auprès de vos produits. Pour plus d'informations, consultez la <docs-link>documentation de l'API Modrinth</docs-link>."
|
||||
@@ -3129,7 +3195,7 @@
|
||||
"message": "Cela révoquera l’accès de l’application à votre compte. Vous pourrez toujours la réautoriser plus tard."
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir révoquer cette application ?"
|
||||
"message": "Êtes-vous sûr de vouloir révoquer cette application ?"
|
||||
},
|
||||
"settings.billing.charges.description": {
|
||||
"message": "Toutes vos transactions passées sur votre compte Modrinth seront affichées ici :"
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Hébergement Modrinth"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Charges passées"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Expire le {date}"
|
||||
},
|
||||
@@ -3201,7 +3264,7 @@
|
||||
"message": "Cela annulera votre abonnement. Vous conserverez vos avantages jusqu’à la fin du cycle de facturation en cours."
|
||||
},
|
||||
"settings.billing.modal.cancel.title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir annuler votre abonnement ?"
|
||||
"message": "Êtes-vous sûr de vouloir annuler votre abonnement ?"
|
||||
},
|
||||
"settings.billing.modal.delete.action": {
|
||||
"message": "Supprimer ce mode de paiement"
|
||||
@@ -3210,7 +3273,7 @@
|
||||
"message": "Cela supprimera définitivement ce mode paiement. (vraiment toujours)."
|
||||
},
|
||||
"settings.billing.modal.delete.title": {
|
||||
"message": "Êtes-vous sûr.e de vouloir supprimer ce mode de paiement ?"
|
||||
"message": "Êtes-vous sûr de vouloir supprimer ce mode de paiement ?"
|
||||
},
|
||||
"settings.billing.next": {
|
||||
"message": "Suivant :"
|
||||
@@ -3249,7 +3312,7 @@
|
||||
"message": "/{interval}"
|
||||
},
|
||||
"settings.billing.pyro.cpu": {
|
||||
"message": "{shared} processeurs partagés (pics jusqu’à {bursts} processeurs)"
|
||||
"message": "{shared} CPU partagés (pics jusqu’à {bursts} CPU)"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.not-found": {
|
||||
"message": "Un serveur lié n’a pas pu être trouvé pour cet abonnement. Il y a plusieurs explications possibles. Si vous venez d’acheter votre serveur, c’est normal. Il peut prendre jusqu’à une heure pour que votre serveur soit provisionné. Sinon, si vous avez acheté ce serveur il y a un certain temps, il a probablement été suspendu depuis. Si ce n’est pas ce à quoi vous vous attendiez, veuillez contacter le support Modrinth avec les informations suivantes :"
|
||||
@@ -3261,7 +3324,7 @@
|
||||
"message": "ID Stripe : {id}"
|
||||
},
|
||||
"settings.billing.pyro.ram": {
|
||||
"message": "{gb} Go de mémoire vive"
|
||||
"message": "{gb} Go de RAM"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.text": {
|
||||
"message": "Une erreur est survenue lors de la tentative de réabonnement à votre serveur Modrinth."
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Erreur lors du réabonnement"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Si le serveur est actuellement suspendu, une nouvelle tentative de paiement peut prendre jusqu’à 10 minutes."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Demande de réabonnement envoyée"
|
||||
},
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -399,7 +399,7 @@
|
||||
"message": "Frissítve {ago}"
|
||||
},
|
||||
"collection.return-link.dashboard-collections": {
|
||||
"message": "A gyűjteményeid"
|
||||
"message": "A te gyűjteményeid"
|
||||
},
|
||||
"collection.return-link.user": {
|
||||
"message": "{user} profilja"
|
||||
@@ -507,7 +507,7 @@
|
||||
"message": "Adj meg egy projekt nevet..."
|
||||
},
|
||||
"create.project.owner-description": {
|
||||
"message": "Állítsd be a projekt tulajdonosát saját magadra vagy egy olyan szervezetre, amelynek tagja vagy."
|
||||
"message": "Állítsa be a projekt tulajdonosát saját magára vagy egy olyan szervezetre, amelynek tagja."
|
||||
},
|
||||
"create.project.owner-label": {
|
||||
"message": "Tulajdonos"
|
||||
@@ -657,7 +657,7 @@
|
||||
"message": "Nettó összeg"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.fee-breakdown-usd-equivalent": {
|
||||
"message": "Amerikai dollárban kifejezett összeg"
|
||||
"message": "USD egyenérték"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.kyc.business-entity": {
|
||||
"message": "Üzleti szervezet"
|
||||
@@ -797,9 +797,6 @@
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.available-denominations-label": {
|
||||
"message": "Elérhető címletek"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.balance-worth-hint": {
|
||||
"message": "A(z) {usdBalance} egyenleged jelenleg {localBalance} értéketű."
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.enter-amount-hint": {
|
||||
"message": "Keress Ajándékkártyákat ez az ár körül."
|
||||
},
|
||||
@@ -821,12 +818,6 @@
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.search-amount-label": {
|
||||
"message": "Összeg keresése"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.select-denomination-hint": {
|
||||
"message": "Válassz kategóriát:"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.select-denomination-required": {
|
||||
"message": "Válassz kategóriát a folytatáshoz"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.tremendous-details.unverified-email-header": {
|
||||
"message": "Hitelesítetlen e-mail"
|
||||
},
|
||||
@@ -845,9 +836,6 @@
|
||||
"dashboard.creator-withdraw-modal.withdraw-limit": {
|
||||
"message": "Pénzfelvételi korlát"
|
||||
},
|
||||
"dashboard.creator-withdraw-modal.withdraw-limit-used": {
|
||||
"message": "Elérted a(z) <b>{withdrawLimit}</b> kifizetési limitet. További kifizetésekhez ki kell töltened egy adózási űrlapot."
|
||||
},
|
||||
"dashboard.revenue.available-now": {
|
||||
"message": "Elérhető most"
|
||||
},
|
||||
@@ -890,18 +878,9 @@
|
||||
"dashboard.revenue.transactions.none": {
|
||||
"message": "Nincsenek tranzakciók"
|
||||
},
|
||||
"dashboard.revenue.transactions.none.desc": {
|
||||
"message": "A kifizetések és a felvételek itt jelennek meg."
|
||||
},
|
||||
"dashboard.revenue.transactions.see-all": {
|
||||
"message": "Összes megtekintése"
|
||||
},
|
||||
"dashboard.revenue.withdraw.blocked-tin-mismatch": {
|
||||
"message": "A kifizetéseid ideiglenesen zárolva vannak, mert az adóazonosító számod vagy a társadalombiztosítási számod nem egyezik az adóhatóság (IRS) nyilvántartásában szereplő adatokkal. Kérjük, vedd fel a kapcsolatot az ügyfélszolgálattal az adóbevallásod visszaállításához és újbóli benyújtásához."
|
||||
},
|
||||
"dashboard.revenue.withdraw.card.description": {
|
||||
"message": "Vegyél fel az elérhető egyenlegéből bármilyen kifizetési móddal."
|
||||
},
|
||||
"dashboard.revenue.withdraw.card.title": {
|
||||
"message": "Pénzfelvétel"
|
||||
},
|
||||
@@ -956,54 +935,21 @@
|
||||
"dashboard.withdraw.error.email-verification.title": {
|
||||
"message": "E-mail hítelesítés szükséges"
|
||||
},
|
||||
"dashboard.withdraw.error.generic.text": {
|
||||
"message": "Nem tudtuk elküldeni a kifizetési kérelmed, kérjük, ellenőrizd az adataid, vagy vedd fel a kapcsolatot az ügyfélszolgálattal.\n{error}"
|
||||
},
|
||||
"dashboard.withdraw.error.generic.title": {
|
||||
"message": "A visszavonási kísérlet nem sikerült"
|
||||
},
|
||||
"dashboard.withdraw.error.insufficient-balance.text": {
|
||||
"message": "Nincs elég pénzed ehhez a fizetéshez."
|
||||
},
|
||||
"dashboard.withdraw.error.insufficient-balance.title": {
|
||||
"message": "Nincs elég vagyonod"
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-address.text": {
|
||||
"message": "A megadott cím nem ellenőrizhető. Ellenőrizd a cím adatait."
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-address.title": {
|
||||
"message": "Cím megerősítése sikertelen"
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-bank.text": {
|
||||
"message": "A megadott bankszámlaadatok érvénytelenek. Ellenőrizd az adatokat."
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-bank.title": {
|
||||
"message": "Helytelen banki adatok"
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-wallet.text": {
|
||||
"message": "A megadott kriptovaluta-tárca címe érvénytelen. Ellenőrizd kétszer, és próbáld újra."
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-wallet.title": {
|
||||
"message": "Érvénytelen pénztárca cím"
|
||||
},
|
||||
"dashboard.withdraw.error.minimum-not-met.text": {
|
||||
"message": "A fizetés összege (díjak levonása után) nem éri el a minimális követelményt. Növeld a fizetés összegét."
|
||||
},
|
||||
"dashboard.withdraw.error.minimum-not-met.title": {
|
||||
"message": "Túl alacsony az összeg"
|
||||
},
|
||||
"dashboard.withdraw.error.paypal-country-mismatch.text": {
|
||||
"message": "Használd a régiódnak (USA vagy Nemzetközi) megfelelő PayPal-átutalási lehetőséget."
|
||||
},
|
||||
"dashboard.withdraw.error.paypal-country-mismatch.title": {
|
||||
"message": "PayPal régió eltérés"
|
||||
},
|
||||
"dashboard.withdraw.error.tax-form.text": {
|
||||
"message": "A fizetési kérelem benyújtásához ki kell töltened egy adóbevallási űrlapot."
|
||||
},
|
||||
"dashboard.withdraw.error.tax-form.title": {
|
||||
"message": "Töltsd ki az adóbevallási űrlapot"
|
||||
},
|
||||
"error.collection.404.list_item.1": {
|
||||
"message": "Elírhatad a gyűjtemémyed linkjét."
|
||||
},
|
||||
@@ -1095,13 +1041,13 @@
|
||||
"message": "Békázva lettél!🐸🐸"
|
||||
},
|
||||
"frog.altText": {
|
||||
"message": "Egy fotórealisztikus festmény egy béka-labirintusról"
|
||||
"message": "Egy fotórealisztikus festmény egy béka labirintusról"
|
||||
},
|
||||
"frog.title": {
|
||||
"message": "Béka"
|
||||
},
|
||||
"hosting-marketing.available-locations": {
|
||||
"message": "Észak-Amerikában, Európában és Délkelet-Ázsiában érhető el széles körű lefedettség mellett."
|
||||
"message": "Észak-Amerikában, Európában és Délkelet-Ázsiában széles körű lefedettség mellett elérhető. Észak-Amerikában, Európában és Délkelet-Ázsiában széles körű lefedettség mellett elérhető."
|
||||
},
|
||||
"hosting-marketing.billing.monthly": {
|
||||
"message": "Havi fizetés"
|
||||
@@ -1110,7 +1056,7 @@
|
||||
"message": "Negyedéves fizetés"
|
||||
},
|
||||
"hosting-marketing.billing.save-with-quarterly": {
|
||||
"message": "Negyedéves számlázással 16% kedvezményt kapsz!"
|
||||
"message": "Negyedéves számlázással 16% kedvezményt kap!"
|
||||
},
|
||||
"hosting-marketing.billing.starting-at": {
|
||||
"message": "Kezdőár: {price} / hó"
|
||||
@@ -1248,7 +1194,7 @@
|
||||
"message": "Pontosan tudod, mire van szükséged?"
|
||||
},
|
||||
"hosting-marketing.medal.info": {
|
||||
"message": "Próbáld ki 5 napig ingyen egy <orange>3 GB-os szervert</orange>, amelyet a <orange>Medal</orange> biztosít"
|
||||
"message": "Próbálja ki 5 napig ingyen a <orange>3 GB-os szervert</orange>, amelyet a <orange>Medal</orange> biztosít"
|
||||
},
|
||||
"hosting-marketing.medal.learn-more": {
|
||||
"message": "További információk"
|
||||
@@ -1301,8 +1247,14 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Válassz a Vanilla, Fabric, Forge, Quilt és NeoForge közül. Ha Modrinthon fut, akkor a szervereden is futtatható."
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Nincs raktáron"
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select,null {Betöltő} other {{loader}}} Verzió"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Szerver visszaállítása"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Minden adatot eltávolít a szerverről, beleértve a világokat, a modokat és a konfigurációs fájlokat is. A biztonsági másolatok megmaradnak, és visszaállíthatók."
|
||||
},
|
||||
"hosting.plan.select-plan": {
|
||||
"message": "Csomag kiválasztása"
|
||||
@@ -1311,7 +1263,7 @@
|
||||
"message": "Modok felfedezése"
|
||||
},
|
||||
"landing.button.go-to-dashboard": {
|
||||
"message": "Ugrás az irányítópultra"
|
||||
"message": "Vissza a főoldalra"
|
||||
},
|
||||
"landing.creator.feature.constantly-evolving.description": {
|
||||
"message": "Kapd meg a legjobb modolási élményt folyamatos frissítésekkel a Modrinth csapattól"
|
||||
@@ -1440,7 +1392,7 @@
|
||||
"message": "Fedezz fel, játssz és ossz meg Minecraft-tartalmakat a közösség számára létrehozott nyílt forráskódú platformunkon."
|
||||
},
|
||||
"layout.action.change-theme": {
|
||||
"message": "Téma"
|
||||
"message": "Kinézet"
|
||||
},
|
||||
"layout.action.create-new": {
|
||||
"message": "Új létrehozása..."
|
||||
@@ -1451,9 +1403,6 @@
|
||||
"layout.action.lookup-by-email": {
|
||||
"message": "Keresés e-mail cím alapján"
|
||||
},
|
||||
"layout.action.manage-affiliates": {
|
||||
"message": "Partnerlinkek kezelése"
|
||||
},
|
||||
"layout.action.manage-server-notices": {
|
||||
"message": "Szerver megjegyzések kezelése"
|
||||
},
|
||||
@@ -1470,17 +1419,11 @@
|
||||
"message": "Új szerver"
|
||||
},
|
||||
"layout.action.publish": {
|
||||
"message": "Létrehozás"
|
||||
},
|
||||
"layout.action.reports": {
|
||||
"message": "Jelentések áttekintése"
|
||||
"message": "Közzététel"
|
||||
},
|
||||
"layout.action.review-projects": {
|
||||
"message": "Projekt áttekintés"
|
||||
},
|
||||
"layout.action.tech-review": {
|
||||
"message": "Technikai áttekintés"
|
||||
},
|
||||
"layout.avatar.alt": {
|
||||
"message": "Avatárod"
|
||||
},
|
||||
@@ -1496,45 +1439,18 @@
|
||||
"layout.banner.build-fail.description": {
|
||||
"message": "A Modrinth felhasználói felületének jelenlegi telepítése nem tudta az API-ból lekérni az állapotadatokat. Ennek oka lehet egy szolgáltatáskimaradás vagy konfigurációs hiba. Kérünk, próbáld meg újra, amikor az API újra elérhetővé válik. Hibakódok: {errors}; Az API jelenlegi linkje: {url}"
|
||||
},
|
||||
"layout.banner.build-fail.title": {
|
||||
"message": "Hiba történt az API állapotának generálása közben a fordítás során."
|
||||
},
|
||||
"layout.banner.preview.description": {
|
||||
"message": "Ha a hivatalos Modrinth weboldalt szeretnéd elérni, látogass el az <link>https://modrinth.com</link> oldalra. Ezt az előzetes telepítést a Modrinth munkatársai tesztelési célokra használják. A <branch-link>{owner}/{branch</branch-link> @ {commit} használatával készült."
|
||||
},
|
||||
"layout.banner.preview.title": {
|
||||
"message": "Ez a Modrinth weboldal előzetes telepítése."
|
||||
},
|
||||
"layout.banner.staging.description": {
|
||||
"message": "A tesztelési környezet teljesen elkülönül az éles Modrinth adatbázistól. Ezt tesztelési és hibakeresési célokra használják, és a Modrinth backend vagy frontend fejlesztés alatt álló, az éles példánynál újabb verzióit futtathatja."
|
||||
},
|
||||
"layout.banner.staging.title": {
|
||||
"message": "A Modrinth színreviteli környezetét nézed"
|
||||
},
|
||||
"layout.banner.subscription-payment-failed.button": {
|
||||
"message": "Számlázási információ frissítése"
|
||||
},
|
||||
"layout.banner.subscription-payment-failed.description": {
|
||||
"message": "Egy vagy több előfizetés megújítása sikertelen. Frissítsd a fizetés módját a hozzáférés elvesztésének elkerülése érdekében!"
|
||||
},
|
||||
"layout.banner.subscription-payment-failed.title": {
|
||||
"message": "Számlázási akció szükséges."
|
||||
},
|
||||
"layout.banner.tax.action": {
|
||||
"message": "Adózási űrlap kitöltése"
|
||||
},
|
||||
"layout.banner.tax.description": {
|
||||
"message": "Idén már több mint {threshold} összeget vettél ki a Modrinth-ből. Az adózási szabályozásoknak való megfelelés érdekében ki kell töltened egy adóbevallási űrlapot. A kifizetések a nyomtatvány benyújtásáig szünetelnek."
|
||||
},
|
||||
"layout.banner.tax.title": {
|
||||
"message": "Adózási űrlap szükséges"
|
||||
},
|
||||
"layout.banner.tin-mismatch.action": {
|
||||
"message": "Támogatással való kapcsolatba lépés"
|
||||
},
|
||||
"layout.banner.tin-mismatch.description": {
|
||||
"message": "A kifizetéseid ideiglenesen zárolva vannak, mert az adóazonosító számod vagy a társadalombiztosítási számod nem egyezik az adóhatóság (IRS) nyilvántartásában szereplő adatokkal. Kérjük, vedd fel a kapcsolatot az ügyfélszolgálattal az adóbevallásod visszaállításához és újbóli benyújtásához."
|
||||
},
|
||||
"layout.banner.tin-mismatch.title": {
|
||||
"message": "Adóbevallási űrlap sikertelen"
|
||||
},
|
||||
@@ -1560,7 +1476,7 @@
|
||||
"message": "Jutalomprogram"
|
||||
},
|
||||
"layout.footer.about.status": {
|
||||
"message": "Állapot"
|
||||
"message": "Státusz"
|
||||
},
|
||||
"layout.footer.legal": {
|
||||
"message": "Jogi megjegyzések"
|
||||
@@ -1577,9 +1493,6 @@
|
||||
"layout.footer.legal.rules": {
|
||||
"message": "Tartalmi szabályok"
|
||||
},
|
||||
"layout.footer.legal.security-notice": {
|
||||
"message": "Biztonsági közlemény"
|
||||
},
|
||||
"layout.footer.legal.terms-of-use": {
|
||||
"message": "Felhasználási feltételek"
|
||||
},
|
||||
@@ -1703,12 +1616,6 @@
|
||||
"moderation.page.reports": {
|
||||
"message": "Jelentések"
|
||||
},
|
||||
"moderation.page.technicalReview": {
|
||||
"message": "Műszaki áttekintés"
|
||||
},
|
||||
"muralpay.account-type.checking": {
|
||||
"message": "Ellenőrzés"
|
||||
},
|
||||
"muralpay.account-type.savings": {
|
||||
"message": "Megtakarítások"
|
||||
},
|
||||
@@ -1766,15 +1673,9 @@
|
||||
"muralpay.country.sk": {
|
||||
"message": "Szlovákia"
|
||||
},
|
||||
"muralpay.document-type.national-id": {
|
||||
"message": "Nemzeti azonosító"
|
||||
},
|
||||
"muralpay.document-type.passport": {
|
||||
"message": "Útlevél"
|
||||
},
|
||||
"muralpay.document-type.resident-id": {
|
||||
"message": "Állampolgársági azonosító"
|
||||
},
|
||||
"muralpay.document-type.ruc": {
|
||||
"message": "RUC"
|
||||
},
|
||||
@@ -1838,15 +1739,6 @@
|
||||
"muralpay.field.swift-bic": {
|
||||
"message": "SWIFT/BIC"
|
||||
},
|
||||
"muralpay.field.wallet-address": {
|
||||
"message": "Pénztárca címe"
|
||||
},
|
||||
"muralpay.help.cbu-cvu": {
|
||||
"message": "Egységes bankkód vagy egységes virtuális kód"
|
||||
},
|
||||
"muralpay.help.cci": {
|
||||
"message": "Bankközi számlakód"
|
||||
},
|
||||
"muralpay.help.clabe": {
|
||||
"message": "Clave Bancaria Estandarizada (Mexikói bank fiók száma)"
|
||||
},
|
||||
@@ -2288,27 +2180,9 @@
|
||||
"project.download.title": {
|
||||
"message": "{title} letöltése"
|
||||
},
|
||||
"project.environment.migration-no-permission.message": {
|
||||
"message": "Átdolgoztuk a Modrinth Környezetek rendszerét, és új beállítások érhetők el. Nincs jogosultságod módosítani ezeket a beállításokat, de kérlek, jelezd a projekt egy másik tagjának, hogy a környezet metaadatait ellenőrizni kell."
|
||||
},
|
||||
"project.environment.migration-no-permission.title": {
|
||||
"message": "A környezeti metaadatokat felül kell vizsgálni"
|
||||
},
|
||||
"project.environment.migration.learn-more": {
|
||||
"message": "Tudj meg többet erről a változásról"
|
||||
},
|
||||
"project.environment.migration.message": {
|
||||
"message": "Átdolgoztuk a Modrinth Környezetek rendszerét, és új lehetőségek érhetők el. Kérjük, ellenőrizd, hogy a metaadatok helyesek-e."
|
||||
},
|
||||
"project.environment.migration.review-button": {
|
||||
"message": "Környezet beállítások Átnézése"
|
||||
},
|
||||
"project.environment.migration.title": {
|
||||
"message": "Kérjük, tekintse át a környezet metaadatait"
|
||||
},
|
||||
"project.error.loading": {
|
||||
"message": "Hiba a projektadatok {message} betöltése közben"
|
||||
},
|
||||
"project.error.page-not-found": {
|
||||
"message": "Az oldal nem található"
|
||||
},
|
||||
@@ -2372,12 +2246,6 @@
|
||||
"project.settings.general.tagline.placeholder.1": {
|
||||
"message": "pl. Átalakítja a játék menetét, hogy az az Alvilág körül forogjon."
|
||||
},
|
||||
"project.settings.general.tagline.placeholder.2": {
|
||||
"message": "pl. Hordható építőipari felszerelést ad hozzá."
|
||||
},
|
||||
"project.settings.general.tagline.placeholder.3": {
|
||||
"message": "pl. Valósághű bányajárat-építő mehanikákat ad hozzá."
|
||||
},
|
||||
"project.settings.general.tagline.placeholder.4": {
|
||||
"message": "pl. Javítja az alvilágportálok egymáshoz való kapcsolódását."
|
||||
},
|
||||
@@ -2409,7 +2277,7 @@
|
||||
"message": "Verziók"
|
||||
},
|
||||
"report.already-reported": {
|
||||
"message": "Már feljelentetted ezt: {title}"
|
||||
"message": "Már jelentetted: {title}-t"
|
||||
},
|
||||
"report.already-reported-description": {
|
||||
"message": "Már létezik egy nyitott jelentésed ehhez a {item, select, project {projekthez} version {verzióhoz} user {felhasználóhoz} other {tartalomhoz}}. További részletekkel egészítheted ki a jelentésed, ha van további információ, amit hozzá szeretnél adni."
|
||||
@@ -2420,12 +2288,6 @@
|
||||
"report.body.description": {
|
||||
"message": "Ha lehetséges és releváns, csatolj linkeket és képeket. Az üres vagy hiányos jelentéseket lezárjuk és figyelmen kívül hagyjuk."
|
||||
},
|
||||
"report.body.title": {
|
||||
"message": "Adj meg további kontextust a jelentéseddel kapcsolatban"
|
||||
},
|
||||
"report.checking": {
|
||||
"message": "{item, select, project {Projekt} version {Verzió} user {Felhasználó} other {Tartalom}} ellenőrzése..."
|
||||
},
|
||||
"report.could-not-find": {
|
||||
"message": "{item, select, project {Projekt} version {Verzió} user {Felhasználó} other {Tartalom}} nem található"
|
||||
},
|
||||
@@ -2436,16 +2298,10 @@
|
||||
"message": "Példák: rosszindulatú, spam, sértő, megtévesztő, félrevezető és illegális tartalom."
|
||||
},
|
||||
"report.form-not-for": {
|
||||
"message": "Viszont ez az űrlap nem erre szolgál:"
|
||||
},
|
||||
"report.go-to-report": {
|
||||
"message": "Jelentés megtekintése"
|
||||
"message": "Ez az űrlap nem alkalmas:"
|
||||
},
|
||||
"report.not-for.bug-reports": {
|
||||
"message": "Hibajelentések"
|
||||
},
|
||||
"report.not-for.bug-reports.description": {
|
||||
"message": "A hibákat a <issues-link>hibajelentő rendszer</issues-link>ben jelentheted be."
|
||||
"message": "Hiba bejenlentések"
|
||||
},
|
||||
"report.not-for.dmca": {
|
||||
"message": "DMCA leszedések"
|
||||
@@ -2465,9 +2321,6 @@
|
||||
"report.note.malicious.2": {
|
||||
"message": "A Microsoft Defender, a VirusTotal vagy az MI rosszindulatú programok észlelése által készített összefoglalók nem minősülnek elegendő bizonyítéknak, ezért nem fogadhatók el."
|
||||
},
|
||||
"report.please-report": {
|
||||
"message": "Kérjük, az alábbiakat jelentsd:"
|
||||
},
|
||||
"report.question.content-id": {
|
||||
"message": "Mi a {item, select, project {projekt} version {verzió} user {felhasználó} other {tartalom}} azonosítója?"
|
||||
},
|
||||
@@ -2493,7 +2346,7 @@
|
||||
"message": "Statisztikák olvasása"
|
||||
},
|
||||
"scopes.category.analytics": {
|
||||
"message": "Statisztika"
|
||||
"message": "Statisztikák"
|
||||
},
|
||||
"scopes.category.collections": {
|
||||
"message": "Kollekciók"
|
||||
@@ -2612,18 +2465,6 @@
|
||||
"scopes.patWrite.label": {
|
||||
"message": "PAT-ek írása"
|
||||
},
|
||||
"scopes.payoutsRead.description": {
|
||||
"message": "Kifizetési adatok olvasása"
|
||||
},
|
||||
"scopes.payoutsRead.label": {
|
||||
"message": "Kifizetések olvasása"
|
||||
},
|
||||
"scopes.payoutsWrite.description": {
|
||||
"message": "Pénzfelvétel"
|
||||
},
|
||||
"scopes.payoutsWrite.label": {
|
||||
"message": "Kifizetések írása"
|
||||
},
|
||||
"scopes.performAnalytics.description": {
|
||||
"message": "Statisztikai műveletek végrehajtása"
|
||||
},
|
||||
@@ -2639,12 +2480,6 @@
|
||||
"scopes.projectDelete.description": {
|
||||
"message": "Projektjeid törlése"
|
||||
},
|
||||
"scopes.projectDelete.label": {
|
||||
"message": "Projektek törlése"
|
||||
},
|
||||
"scopes.projectRead.description": {
|
||||
"message": "Olvasd el az összes projektedet"
|
||||
},
|
||||
"scopes.projectRead.label": {
|
||||
"message": "Projektek Olvasása"
|
||||
},
|
||||
@@ -2678,9 +2513,6 @@
|
||||
"scopes.reportWrite.label": {
|
||||
"message": "Jelentések írása"
|
||||
},
|
||||
"scopes.sessionAccess.description": {
|
||||
"message": "Modrinth által kiadott munkamenetek elérése"
|
||||
},
|
||||
"scopes.sessionAccess.label": {
|
||||
"message": "Munkamenetek hozzáférése"
|
||||
},
|
||||
@@ -2708,63 +2540,6 @@
|
||||
"scopes.threadWrite.label": {
|
||||
"message": "Szálakban írás"
|
||||
},
|
||||
"scopes.userAuthWrite.description": {
|
||||
"message": "Módosítsd a hitelesítési adataidat"
|
||||
},
|
||||
"scopes.userAuthWrite.label": {
|
||||
"message": "Hitelesítési adatok írása"
|
||||
},
|
||||
"scopes.userDelete.description": {
|
||||
"message": "Fiók törlése"
|
||||
},
|
||||
"scopes.userDelete.label": {
|
||||
"message": "Fiók törlése"
|
||||
},
|
||||
"scopes.userRead.description": {
|
||||
"message": "Hozzáférés a nyilvános profilinformációihoz"
|
||||
},
|
||||
"scopes.userRead.label": {
|
||||
"message": "Felhasználói adatok olvasása"
|
||||
},
|
||||
"scopes.userReadEmail.description": {
|
||||
"message": "Olvasd el az e-mailedet"
|
||||
},
|
||||
"scopes.userReadEmail.label": {
|
||||
"message": "Felhasználói e-mail olvasása"
|
||||
},
|
||||
"scopes.userWrite.description": {
|
||||
"message": "Írj a profilodra"
|
||||
},
|
||||
"scopes.userWrite.label": {
|
||||
"message": "Felhasználói adatok írása"
|
||||
},
|
||||
"scopes.versionCreate.description": {
|
||||
"message": "Új verziók létrehozása"
|
||||
},
|
||||
"scopes.versionCreate.label": {
|
||||
"message": "Verziók létrehozása"
|
||||
},
|
||||
"scopes.versionDelete.description": {
|
||||
"message": "Verziók törlése"
|
||||
},
|
||||
"scopes.versionDelete.label": {
|
||||
"message": "Verziók törlése"
|
||||
},
|
||||
"scopes.versionRead.description": {
|
||||
"message": "Az összes verzió elolvasása"
|
||||
},
|
||||
"scopes.versionRead.label": {
|
||||
"message": "Verziók olvasása"
|
||||
},
|
||||
"scopes.versionWrite.description": {
|
||||
"message": "Verzióadatok írása"
|
||||
},
|
||||
"scopes.versionWrite.label": {
|
||||
"message": "Verziók írása"
|
||||
},
|
||||
"search.filter.game-version-shader-message": {
|
||||
"message": "A régebbi verziókhoz tartozó shader csomagok valószínűleg az újabb verziókon is működnek, csak kisebb problémákkal."
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "A szerver által van megadva"
|
||||
},
|
||||
@@ -2778,10 +2553,7 @@
|
||||
"message": "Szinkronizálás a szerverrel"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Műveletek"
|
||||
},
|
||||
"servers.notice.begins": {
|
||||
"message": "Kezdődik"
|
||||
"message": "Akciók"
|
||||
},
|
||||
"servers.notice.dismissable": {
|
||||
"message": "Elutasítható"
|
||||
@@ -2999,9 +2771,6 @@
|
||||
"settings.account.two-factor.setup.intro": {
|
||||
"message": "A kétlépcsős hitelesítés biztosítja fiókod biztonságát azzal, hogy a bejelentkezéshez egy második eszköz használatát is megköveteli."
|
||||
},
|
||||
"settings.account.two-factor.setup.manual-secret": {
|
||||
"message": "Ha a QR-kód nem olvassa be a kódot, manuálisan is megadhatja a titkos kódot:"
|
||||
},
|
||||
"settings.account.two-factor.setup.scan": {
|
||||
"message": "Olvassa be a QR-kódot az <authy-link>Authy</authy-link>, a <microsoft-authenticator-link>Microsoft Authenticator</microsoft-authenticator-link> vagy bármely más kétlépcsős hitelesítési alkalmazás segítségével a folyamat megkezdéséhez."
|
||||
},
|
||||
@@ -3053,15 +2822,9 @@
|
||||
"settings.applications.delete.confirm.button": {
|
||||
"message": "Alkamazás törlése"
|
||||
},
|
||||
"settings.applications.delete.confirm.description": {
|
||||
"message": "Ez véglegesen törli ezt az alkalmazást és visszavonja az összes hozzáférési tokent. (örökre!)"
|
||||
},
|
||||
"settings.applications.delete.confirm.title": {
|
||||
"message": "Biztos törölni szeretnéd ezt az alkamazást?"
|
||||
},
|
||||
"settings.applications.description.intro": {
|
||||
"message": "Az alkalmazások segítségével hitelesítheti a Modrinth felhasználóit a termékeivel. További információkért lásd a <docs-link>Modrinth API dokumentációját</docs-link>."
|
||||
},
|
||||
"settings.applications.field.description": {
|
||||
"message": "Leírás"
|
||||
},
|
||||
@@ -3107,93 +2870,15 @@
|
||||
"settings.applications.secret.disclaimer": {
|
||||
"message": "A secreteted most mentesd el, el lesz tüntetve mituán elhagyod ezt az oldalt!"
|
||||
},
|
||||
"settings.authorizations.about-this-app": {
|
||||
"message": "Az alkalmazásról"
|
||||
},
|
||||
"settings.authorizations.by": {
|
||||
"message": "által"
|
||||
},
|
||||
"settings.authorizations.description": {
|
||||
"message": "Amikor engedélyezel egy alkalmazást a Modrinth-fiókjoddal, hozzáférést biztosítasz számára a fiókodhoz. A fiókodhoz való hozzáférést bármikor kezelheted és ellenőrizheted itt."
|
||||
},
|
||||
"settings.authorizations.empty-state": {
|
||||
"message": "Jelenleg nem tudjuk megjeleníteni a jogosult alkalmazásait, dolgozunk a probléma megoldásán. Kérjük, látogassa meg ezt az oldalt később!"
|
||||
},
|
||||
"settings.authorizations.head-title": {
|
||||
"message": "Engedélyek"
|
||||
},
|
||||
"settings.authorizations.revoke.action": {
|
||||
"message": "Visszavonás"
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.description": {
|
||||
"message": "Ez visszavonja az alkalmazás hozzáférését a fiókodhoz. Később bármikor újra engedélyezheted."
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.title": {
|
||||
"message": "Biztosan visszavonod ezt a kérelmet?"
|
||||
},
|
||||
"settings.billing.charges.description": {
|
||||
"message": "A Modrinth-számládra korábban leadott összes fiókod itt lesz felsorolva:"
|
||||
},
|
||||
"settings.billing.charges.product.medal-trial": {
|
||||
"message": "Medal Server próbaverzió"
|
||||
},
|
||||
"settings.billing.charges.product.midas": {
|
||||
"message": "Modrinth Plus"
|
||||
},
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Korábbi költségek"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Lejár: {date}"
|
||||
},
|
||||
"settings.billing.interval.month": {
|
||||
"message": "hónap"
|
||||
},
|
||||
"settings.billing.interval.monthly": {
|
||||
"message": "havi"
|
||||
},
|
||||
"settings.billing.interval.year": {
|
||||
"message": "év"
|
||||
},
|
||||
"settings.billing.interval.yearly": {
|
||||
"message": "éves"
|
||||
},
|
||||
"settings.billing.midas.benefits.ad-free": {
|
||||
"message": "Reklámmentes böngészés a modrinth.com-on és a Modrinth App-ban"
|
||||
},
|
||||
"settings.billing.midas.benefits.badge": {
|
||||
"message": "Modrinth+ jelvény a profilodon"
|
||||
},
|
||||
"settings.billing.midas.benefits.support": {
|
||||
"message": "Támogasd közvetlenül a Modrinth-et és a fejlesztőit"
|
||||
},
|
||||
"settings.billing.midas.benefits.title": {
|
||||
"message": "Előnyök"
|
||||
},
|
||||
"settings.billing.midas.save-per-year": {
|
||||
"message": "Spórolj {amount}/évet éves számlázásra váltva!"
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line1": {
|
||||
"message": "Lemondtad az előfizetésedet."
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line2": {
|
||||
"message": "A juttatásaidat a jelenlegi számlázási ciklus végéig megtartod."
|
||||
},
|
||||
"settings.billing.midas.status.failed": {
|
||||
"message": "Az előfizetés fizetése sikertelen. Frissítse a fizetési módot."
|
||||
},
|
||||
"settings.billing.midas.status.open": {
|
||||
"message": "Jelenleg erre van előfizetésed:"
|
||||
},
|
||||
"settings.billing.midas.status.processing": {
|
||||
"message": "A fizetésed feldolgozás alatt áll. A juttatások a fizetés befejezése után aktiválódnak."
|
||||
},
|
||||
"settings.billing.midas.upsell": {
|
||||
"message": "Iratkozz fel a Modrinth Plusra!"
|
||||
},
|
||||
"settings.billing.modal.cancel.action": {
|
||||
"message": "Előfizetés lemondása"
|
||||
},
|
||||
@@ -3212,60 +2897,18 @@
|
||||
"settings.billing.modal.delete.title": {
|
||||
"message": "Biztos törölni szeretnéd ezt a fizetési lehetőséget?"
|
||||
},
|
||||
"settings.billing.next": {
|
||||
"message": "Következő:"
|
||||
},
|
||||
"settings.billing.or-yearly-save": {
|
||||
"message": "Vagy {price} / év ({percent}% megtakarítás)!"
|
||||
},
|
||||
"settings.billing.payment_method.action.add": {
|
||||
"message": "Fizetési lehetőség hozzáadása"
|
||||
},
|
||||
"settings.billing.payment_method.action.history": {
|
||||
"message": "Korábbi költségeid megtekintése"
|
||||
},
|
||||
"settings.billing.payment_method.action.primary": {
|
||||
"message": "Elsődlegesé rakás"
|
||||
},
|
||||
"settings.billing.payment_method.card_expiry": {
|
||||
"message": "Lejár: {month}/{year}"
|
||||
},
|
||||
"settings.billing.payment_method.none": {
|
||||
"message": "Nem adtál hozzá fizetési módokat"
|
||||
},
|
||||
"settings.billing.payment_method.primary": {
|
||||
"message": "Elsődleges"
|
||||
},
|
||||
"settings.billing.payment_method.title": {
|
||||
"message": "Fizetési módok"
|
||||
},
|
||||
"settings.billing.plan.title": {
|
||||
"message": "{size} terv"
|
||||
},
|
||||
"settings.billing.price.per-interval": {
|
||||
"message": "{price} / {interval}"
|
||||
},
|
||||
"settings.billing.price.slash-interval": {
|
||||
"message": "/{interval}"
|
||||
},
|
||||
"settings.billing.pyro.cpu": {
|
||||
"message": "{shared} Megosztott CPU-k (maximum {bursts} CPU-ig terjedő löketek)"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.not-found": {
|
||||
"message": "Nem található ehhez az előfizetéshez csatolt szerver. Ennek több lehetséges magyarázata is van. Ha nemrég vásároltad meg a szervert, ez normális. A szerver kiépítése akár egy órát is igénybe vehet. Ellenkező esetben, ha egy ideje vásároltad meg ezt a szervert, valószínűleg azóta felfüggesztették. Ha nem erre számítottál, kérjük, vedd fel a kapcsolatot a Modrinth ügyfélszolgálatával a következő információkkal:"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.server-id": {
|
||||
"message": "Szerverazonosító: {id}"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.stripe-id": {
|
||||
"message": "Sáv azonosító: {id}"
|
||||
},
|
||||
"settings.billing.pyro.ram": {
|
||||
"message": "{gb} GB RAM"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.text": {
|
||||
"message": "Hiba történt a Modrinth szerverre való újbóli feliratkozás során."
|
||||
},
|
||||
"settings.billing.pyro_subscription.title": {
|
||||
"message": "Modrinth Szerver Előfizetések"
|
||||
},
|
||||
@@ -3467,15 +3110,6 @@
|
||||
"ui.latest-news-row.view-all": {
|
||||
"message": "Összes hír"
|
||||
},
|
||||
"ui.newsletter-button.subscribe": {
|
||||
"message": "Feliratkozás"
|
||||
},
|
||||
"ui.newsletter-button.subscribed": {
|
||||
"message": "Feliratkozva!"
|
||||
},
|
||||
"ui.newsletter-button.tooltip": {
|
||||
"message": "Feliratkozás a Modrinth hírlevelére"
|
||||
},
|
||||
"version.environment.none.description": {
|
||||
"message": "A környezet erre a verzióra nem lett megadva."
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,39 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Pilih antara Vanila, Fabric, Forge, Quilt, dan NeoForge. Bila ia ada di Modrinth, ia dapat dijalankan di server Anda."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Gagal mengubah versi paket mod"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Gagal memuat versi"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Gagal memasang ulang paket mod"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Gagal memperbaiki server"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Gagal menyinpan pengaturan pemasangan"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Gagal melepas tautan paket mod"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "Versi {loader, select, null {pemuat} other {{loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Pemasangan server Anda telah diperbaiki."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Perbaikan selesai"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Atur ulang server"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Menghapus semua data pada server Anda, termasuk dunia, mod, dan berkas konfigurasi Anda. Cadangan akan tetap ada dan dapat dipulihkan."
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Habis"
|
||||
},
|
||||
@@ -2777,6 +2810,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Sinkronkan dengan server"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Sedang membuat cadangan"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Sedang memulihkan cadangan"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Server sedang dipasang"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Sedang menyingkronkan konten"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Tindakan"
|
||||
},
|
||||
@@ -2813,114 +2858,6 @@
|
||||
"servers.plan.small.description": {
|
||||
"message": "Cocok untuk 1—5 orang teman dengan beberapa mod ringan."
|
||||
},
|
||||
"settings.account.delete.confirm.proceed": {
|
||||
"message": "Hapus akun ini"
|
||||
},
|
||||
"settings.account.delete.confirm.title": {
|
||||
"message": "Apakah Anda yakin ingin menghapus akun ini?"
|
||||
},
|
||||
"settings.account.delete.section.action": {
|
||||
"message": "Hapus akun"
|
||||
},
|
||||
"settings.account.delete.section.description": {
|
||||
"message": "Setelah Anda menghapus akun Anda, tidak ada cara untuk kembali. Menghapus akun Anda akan menghapus semua data terkait, kecuali proyek, dari server kami."
|
||||
},
|
||||
"settings.account.delete.section.title": {
|
||||
"message": "Hapus akun"
|
||||
},
|
||||
"settings.account.email.action.save": {
|
||||
"message": "Simpan sur-el"
|
||||
},
|
||||
"settings.account.email.field.label": {
|
||||
"message": "Alamat sur-el"
|
||||
},
|
||||
"settings.account.email.field.placeholder": {
|
||||
"message": "Masukkan alamat sur-el Anda..."
|
||||
},
|
||||
"settings.account.email.modal.header.add": {
|
||||
"message": "Tambah sur-el"
|
||||
},
|
||||
"settings.account.email.modal.header.change": {
|
||||
"message": "Ubah sur-el"
|
||||
},
|
||||
"settings.account.email.modal.notice": {
|
||||
"message": "Informasi akun Anda tidak ditampilkan secara umum."
|
||||
},
|
||||
"settings.account.password.action.remove": {
|
||||
"message": "Hapus kata sandi"
|
||||
},
|
||||
"settings.account.password.action.save": {
|
||||
"message": "Simpan kata sandi"
|
||||
},
|
||||
"settings.account.password.error.mismatch": {
|
||||
"message": "Kata sandi yang dimasukkan tidak cocok!"
|
||||
},
|
||||
"settings.account.password.field.confirm-current.description": {
|
||||
"message": "Mohon masukkan kata sandi Anda untuk melanjutkan."
|
||||
},
|
||||
"settings.account.password.field.confirm-current.label": {
|
||||
"message": "Konfirmasi kata sandi"
|
||||
},
|
||||
"settings.account.password.field.confirm-current.placeholder": {
|
||||
"message": "Konfirmasi kata sandi"
|
||||
},
|
||||
"settings.account.password.field.confirm-new.label": {
|
||||
"message": "Konfirmasi kata sandi baru"
|
||||
},
|
||||
"settings.account.password.field.confirm-new.placeholder": {
|
||||
"message": "Konfirmasi kata sandi baru"
|
||||
},
|
||||
"settings.account.password.field.new.label": {
|
||||
"message": "Kata sandi baru"
|
||||
},
|
||||
"settings.account.password.field.new.placeholder": {
|
||||
"message": "Kata sandi baru"
|
||||
},
|
||||
"settings.account.password.field.old.label": {
|
||||
"message": "Kata sandi lama"
|
||||
},
|
||||
"settings.account.password.field.old.placeholder": {
|
||||
"message": "Kata sandi lama"
|
||||
},
|
||||
"settings.account.password.modal.header.add": {
|
||||
"message": "Tambah kata sandi"
|
||||
},
|
||||
"settings.account.password.modal.header.change": {
|
||||
"message": "Ubah kata sandi"
|
||||
},
|
||||
"settings.account.password.modal.header.remove": {
|
||||
"message": "Hapus kata sandi"
|
||||
},
|
||||
"settings.account.providers.action.add": {
|
||||
"message": "Tambah"
|
||||
},
|
||||
"settings.account.providers.modal.header": {
|
||||
"message": "Penyedia autentikasi"
|
||||
},
|
||||
"settings.account.providers.table.actions": {
|
||||
"message": "Tindakan"
|
||||
},
|
||||
"settings.account.providers.table.provider": {
|
||||
"message": "Penyedia"
|
||||
},
|
||||
"settings.account.security.email.action.add": {
|
||||
"message": "Tambah sur-el"
|
||||
},
|
||||
"settings.account.security.email.action.change": {
|
||||
"message": "Ubah sur-el"
|
||||
},
|
||||
"settings.account.security.email.description": {
|
||||
"message": "Mengganti sur-el yang berkaitan dengan akun Anda."
|
||||
},
|
||||
"settings.account.security.email.title": {
|
||||
"message": "Sur-el"
|
||||
},
|
||||
"settings.account.security.password.action.add": {
|
||||
"message": "Tambah kata sandi"
|
||||
},
|
||||
"settings.account.security.password.action.change": {
|
||||
"message": "Ubah kata sandi"
|
||||
},
|
||||
"settings.applications.about": {
|
||||
"message": "Tentang"
|
||||
},
|
||||
|
||||
@@ -333,7 +333,7 @@
|
||||
"message": "Verifica email"
|
||||
},
|
||||
"auth.welcome.checkbox.subscribe": {
|
||||
"message": "Ricevi novità riguardo a Modrinth"
|
||||
"message": "Ricevi novità riguardanti Modrinth"
|
||||
},
|
||||
"auth.welcome.description": {
|
||||
"message": "Fai ora parte della grandiosa comunità di creatori ed esploratori che già costruiscono, aggiornano e stanno sul pezzo con le fantastiche mod."
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Scegli tra Vanilla, Fabric, Forge, Quilt e NeoForge. Se è su Modrinth, il tuo server può usarlo."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Errore nella modifica della versione del pacchetto"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Errore nel caricamento delle versioni"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Errore nel reinstallare il pacchetto"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Errore nella riparazione del server"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Errore nella reinizializzazione"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Errore nel salvataggio delle impostazioni"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Errore nello scollegamento del pacchetto"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "Versione {loader, select, null {del loader} other {di {loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "L'installazione del server è stata riparata."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Riparazione completata"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Reimposta server"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Rimuove tutti i dati dal tuo server, inclusi i mondi, mod, e configurazioni. Eventuali backup rimarranno intatti e potranno essere ripristinati."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Reinizializza"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Il server verrà ripristinato alla configurazione iniziale così da poterlo riconfigurare. Vuoi davvero continuare?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Reinizializza"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "Il server è stato ripristinato alla configurazione iniziale."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Server reinizializzato"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Opzioni di assistenza"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Non disponibile"
|
||||
},
|
||||
@@ -1554,7 +1608,7 @@
|
||||
"message": "Note di versione"
|
||||
},
|
||||
"layout.footer.about.news": {
|
||||
"message": "Notizie"
|
||||
"message": "Novità"
|
||||
},
|
||||
"layout.footer.about.rewards-program": {
|
||||
"message": "Programma Premi"
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Sincronizza col server"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "È in corso la creazione di un backup"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "È in corso il ripristino da un backup"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "È in corso l'installazione del server"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "È in corso la sincronizzazione dei contenuti"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Azioni"
|
||||
},
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Addebiti precedenti"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Scade: {date}"
|
||||
},
|
||||
@@ -3155,12 +3218,6 @@
|
||||
"settings.billing.interval.monthly": {
|
||||
"message": "mensile"
|
||||
},
|
||||
"settings.billing.interval.quarter": {
|
||||
"message": "trimestre"
|
||||
},
|
||||
"settings.billing.interval.quarterly.adjective": {
|
||||
"message": "trimestrale"
|
||||
},
|
||||
"settings.billing.interval.year": {
|
||||
"message": "anno"
|
||||
},
|
||||
@@ -3276,7 +3333,7 @@
|
||||
"message": "Errore nel riabbonamento"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Se il server era stato annullato, potrebbero volerci 10-15 minuti per impostarlo."
|
||||
"message": "Se il server è in sospensione, un nuovo tentativo di addebito potrebbe richiedere fino a 10 minuti."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Richiesta di riabbonamento inviata"
|
||||
@@ -3540,10 +3597,10 @@
|
||||
"message": "Visualizzazione"
|
||||
},
|
||||
"ui.latest-news-row.latest-news": {
|
||||
"message": "Ultime notizie da Modrinth"
|
||||
"message": "Novità da Modrinth"
|
||||
},
|
||||
"ui.latest-news-row.view-all": {
|
||||
"message": "Leggi tutte le notizie"
|
||||
"message": "Leggi tutte le novità"
|
||||
},
|
||||
"ui.newsletter-button.subscribe": {
|
||||
"message": "Iscriviti"
|
||||
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Vanilla、Fabric、Forge、Quilt、NeoForgeから選択してください。Modrinth上で動作するものは、あなたのサーバーでも実行可能です。"
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Modパックバージョンの変更に失敗しました"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "バージョンの読み込みに失敗しました"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Modパックの再インストールに失敗しました"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "サーバーの修復に失敗しました"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "サーバー設定の初期化に失敗しました"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "インストール設定の保存に失敗しました"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Modパックのリンク解除に失敗しました"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "ローダーのバージョン"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "サーバーのインストールが修復されました。"
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "修復が完了しました"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "サーバーをリセット"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "サーバー上のワールド、Mod、設定ファイルを含むすべてのデータを削除します。 バックアップは残り、復元できます。"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "初期状態に戻す"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "これを行うことでサーバーが初期状態に戻されるためセットアップをもう一度行う必要があります。本当に続行しますか?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "初期化"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "サーバーが初期状態に戻されました。"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "サーバー初期化"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "サポート項目"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "品切れ"
|
||||
},
|
||||
@@ -2055,7 +2109,7 @@
|
||||
"message": "組織"
|
||||
},
|
||||
"profile.label.projects": {
|
||||
"message": "{count} {countPlural, plural, one {プロジェクト} other {プロジェクト}}"
|
||||
"message": "{count}件のプロジェクト"
|
||||
},
|
||||
"profile.label.saving": {
|
||||
"message": "保存中…"
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "サーバーと同期"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "進行中のバックアップの作成"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "進行中のバックアップの復元"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "サーバーはインストール中です"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "進行中のコンテンツの同期"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "アクション"
|
||||
},
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "過去の請求"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "有効期限: {date}"
|
||||
},
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "再登録エラー"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "サーバーが一時停止中の場合、再請求の試行まで最大10分かかることがあります。"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "再加入申請を受け付けました"
|
||||
},
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"message": "사용자를 찾을 수 없습니다"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "데스크톱 앱은 모든 플랫폼에서 사용할 수 있습니다. 원하는 버전을 선택하세요."
|
||||
"message": "데스크톱 앱은 모든 플랫폼에서 사용할 수 있으며, 원하는 버전을 선택하세요."
|
||||
},
|
||||
"app-marketing.download.download-appimage": {
|
||||
"message": "AppImage 다운로드"
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "바닐라, Fabric, Forge, Quilt, NeoForge 중에서 선택하세요. Modrinth에서 실행되는 모드라면 여러분의 서버에서도 실행할 수 있습니다."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "모드팩 버전 변경 실패"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "버전 불러오기 실패"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "모드팩 재설치 실패"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "서버 복구 실패"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "서버 온보딩 상태로 재설정 실패"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "설치 설정 저장 실패"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "모드팩 연결 해제 실패"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {로더} other {{loader}}} 버전"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "서버 설치가 복구되었습니다."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "복구 완료"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "서버 초기화"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "서버에 저장된 세계, 모드, 설정 파일 등의 모든 데이터가 삭제됩니다. 백업 파일은 그대로 유지되며, 필요 시 복원할 수 있습니다."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "온보딩 상태로 재설정"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "서버가 다시 온보딩 단계로 돌아가 설정을 다시 완료할 수 있습니다. 계속하시겠습니까?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "온보딩 상태로 재설정"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "서버가 온보딩 상태로 되돌아갔습니다."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "온보딩 상태로 서버 재설정"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "지원 옵션"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "품절"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "서버와 동기화"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "백업 생성 진행 중"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "백업 복원 진행 중"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "서버 설치 중"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "콘텐츠 동기화 진행 중"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "활동"
|
||||
},
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "과거 결제 내역"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "{date} 만료"
|
||||
},
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "재구독 오류"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "서버가 현재 일시 중지된 상태라면, 다음 결제 시도가 이루어지기까지 최대 10분이 소요될 수 있습니다."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "재구독 요청 접수됨"
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Pilih antara Vanila, Fabric, Forge, Quilt dan NeoForge. Jika ia berada di Modrinth, ia boleh dijalankan pada pelayan anda."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Gagal menukar versi pek mod"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Gagal memuat versi"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Gagal memasang semula pek mod"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Gagal membaiki pelayan"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Gagal menetapkan semula pelayan kepada proses penetapan awal"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Gagal menyimpan tetapan pemasangan"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Gagal menyahpaut pek mod"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "Versi {loader, select, null {Pemuat} other {{loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Pemasangan pelayan anda telah dibaiki."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Pembaikan selesai"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Tetap semula pelayan"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Mengalih keluar semua data pada pelayan anda, termasuk dunia, mod dan fail konfigurasi anda. Sandaran akan kekal tersedia dan boleh dipulihkan."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Tetap semula ke proses penetapan awal"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Pilihan ini akan mengembalikan pelayan ke proses penetapan awal supaya penetapan boleh diselesaikan semula. Adakah anda pasti mahu meneruskan?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Tetap semula ke proses penetapan awal"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "Pelayan telah dikembalikan ke aliran penetapan awal."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Pelayan ditetapkan semula ke proses penetapan awal"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Pilihan sokongan"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Kehabisan stok"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Selaraskan dengan pelayan"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Penciptaan sandaran sedang dijalankan"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Pemulihan sandaran sedang dijalankan"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Pelayan sedang dipasang"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Penyegerakan kandungan sedang dijalankan"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Tindakan"
|
||||
},
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Caj sebelum ini"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Akan tamat tempoh {date}"
|
||||
},
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Ralat semasa melanggan semula"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Jika pelayan sedang digantung, percubaan pengecasan lain mungkin mengambil masa sehingga 10 minit."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Permintaan langganan semula telah dihantar"
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,9 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Kies tussen Vanilla, Fabric, Forge, Quilt en NeoForge. Als het op Modrinth is kan het op uw server."
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Jou server installatie is gerepareerd."
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Uitverkocht"
|
||||
},
|
||||
@@ -2813,36 +2816,6 @@
|
||||
"servers.plan.small.description": {
|
||||
"message": "Perfect voor 1-5 vrienden en een paar lichte mods"
|
||||
},
|
||||
"settings.account.button.complete-setup": {
|
||||
"message": "Vervolledig setup"
|
||||
},
|
||||
"settings.account.delete.confirm.title": {
|
||||
"message": "Weet u zeker dat u uw account wilt verwijderen?"
|
||||
},
|
||||
"settings.account.delete.section.action": {
|
||||
"message": "Verwijder account"
|
||||
},
|
||||
"settings.account.delete.section.title": {
|
||||
"message": "Verwijder account"
|
||||
},
|
||||
"settings.account.email.action.save": {
|
||||
"message": "Sla email op"
|
||||
},
|
||||
"settings.account.email.field.label": {
|
||||
"message": "Email adres"
|
||||
},
|
||||
"settings.account.email.field.placeholder": {
|
||||
"message": "Voer uw e-mailadres in..."
|
||||
},
|
||||
"settings.account.email.modal.header.add": {
|
||||
"message": "Voeg e-mailadres toe"
|
||||
},
|
||||
"settings.account.email.modal.header.change": {
|
||||
"message": "Verander e-mailadres"
|
||||
},
|
||||
"settings.account.email.modal.notice": {
|
||||
"message": "......................"
|
||||
},
|
||||
"settings.account.password.action.remove": {
|
||||
"message": "Wachtwoord verwijderen"
|
||||
},
|
||||
@@ -2876,9 +2849,6 @@
|
||||
"settings.account.providers.table.actions": {
|
||||
"message": "Acties"
|
||||
},
|
||||
"settings.account.security.email.action.add": {
|
||||
"message": "Voeg e-mailadres toe"
|
||||
},
|
||||
"settings.account.security.password.action.add": {
|
||||
"message": "Wachtwoord toevoegen"
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,39 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Velg mellom Vanilla, Fabric, Forge, Quilt og NeoForge. Hvis det er på Modrinth, så kan det kjøre på serveren din."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Kunne ikke endre modpakkeversjon"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Kunne ikke laste inn versjoner"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Kunne ikke re-installere modpakka"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Kunne ikke reparere serveren"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Kunne ikke lagre installeringsinnstillinger"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Kunne ikke kople fra modpakka"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Loader} other {{loader}}} versjon"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Serverinstalleringa di har blitt reparert."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Reparering fullført"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Tilbakestill server"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Fjerner all data på serveren din, inkludert verdene dine, modsa dine og konfigurasjonsfilene dine. Sikkerhetskopier blir igjen og kan bli gjenoppretta."
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Utsolgt"
|
||||
},
|
||||
@@ -2777,6 +2810,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Synkroniser med server"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Sikkerhetskopieringsinstanse på veg"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Gjennoppretting av sikkerhetskopier på veg"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Server blir installert"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Syncing av innhold pågår"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Handlinger"
|
||||
},
|
||||
@@ -3266,6 +3311,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Error når vi prøvde å abonnere igjen"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Viss serveren for tida er suspendert, så kan det ta opp til 10 minutt for å prøve å betale igjen."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Forespørsel om å abonnere igjen har blitt sendt inn"
|
||||
},
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"message": "Tryb offline"
|
||||
},
|
||||
"app-marketing.features.open-source.description": {
|
||||
"message": "Modrinth Launcher jest w pełni otwarto-źródłowy. Kod źródłowy możesz zobaczyć na naszym <github-link>GitHubie</github-link>!"
|
||||
"message": "Launcher Modrinth jest w pełni otwarto-źródłowy. Kod źródłowy możesz zobaczyć na naszym <github-link>GitHubie</github-link>!"
|
||||
},
|
||||
"app-marketing.features.open-source.title": {
|
||||
"message": "Otwarte oprogramowanie"
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Wybieraj między Vanilla, Fabric, Forge, Quilt i NeoForge. Jeśli coś jest na Modrinth, może działać na Twoim serwerze."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Nie udało się zmienić wersji paczki modów"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Nie udało się załadować wersji"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Nie udało się zainstalować ponownie paczki modów"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Nie udało się naprawić serwera"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Nie udało się zresetować serwera do trybu onboardingu"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Nie udało się zapisać ustawień instalacji"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Nie udało się rozłączyć od paczki modów"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "Wersja {loader, select, null {loadera} other {{loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Twoja instalacja serwera została naprawiona."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Naprawa ukończona"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Zresetuj serwer"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Usuwa wszystkie dane z Twojego serwera, w tym światy, mody i pliki konfiguracji. Kopie zapasowe nie ulegną zmianie i nadal będą mogły być przywrócone."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Resetuj do trybu onboardingu"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "To przywróci serwer do trybu onboardingu, skąd będzie można ustawić go od nowa. Czy jesteś pewien?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Resetuj do trybu onboardingu"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "Serwer został przywrócony do trybu onboardingu."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Resetuj serwer do trybu onboardingu"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Opcje pomocy"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Wyprzedane"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Synchronizuj z serwerem"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Trwa tworzenie kopii zapasowej"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Trwa przywracanie kopii zapasowej"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Serwer jest instalowany"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Synchronizacja zawartości w toku"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Akcje"
|
||||
},
|
||||
@@ -3132,7 +3198,7 @@
|
||||
"message": "Czy na pewno chcesz unieważnić dostęp tej aplikacji?"
|
||||
},
|
||||
"settings.billing.charges.description": {
|
||||
"message": "Wszystkie pobrane opłaty z twojego konta Modrinth są wyświetlane poniżej:"
|
||||
"message": "Wszystkie poprzednie wydatki z twojego konta Modrinth są wyświetlane poniżej:"
|
||||
},
|
||||
"settings.billing.charges.product.medal-trial": {
|
||||
"message": "Okres próbny Medal"
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Pobrane opłaty"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Wygasa {date}"
|
||||
},
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Błąd ponawiania subskrypcji"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Jeżeli serwer jest aktualnie zawieszony, następna próba pobrania opłaty może potrwać około 10 minut."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Wysłano wniosek o ponowienie subskrypcji"
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Escolha entre Jogo padrão, Fabric, Forge, Quilt e NeoForge. Se estiver no Modrinth, pode ser executado no seu servidor."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Falha ao alterar a versão do pacote de mods"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Falha ao carregar as versões"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Falha ao reinstalar o pacote de mods"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Falha ao reparar o servidor"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Falha ao redefinir o servidor para a integração"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Falha ao salvar as configurações de instalação"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Falha ao desvincular o pacote de mods"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Carregador} other {{loader}}} versão"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "A instalação do seu servidor foi reparada."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Reparo concluído"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Reiniciar servidor"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Remove todos os dados do seu servidor, incluindo seus mundos, mods e arquivos de configuração. As cópias de segurança permanecerão e poderão ser restauradas."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Redefinir para a integração"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Isso enviará o servidor de volta para a integração, para que a configuração possa ser concluída novamente. Tem certeza de que deseja continuar?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Redefinir para a integração"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "O servidor foi retornado ao fluxo de integração."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Servidor redefinido para a integração"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Opções de suporte"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Esgotado"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Sincronizar com o servidor"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Criação de cópia de segurança em andamento"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Restauração da cópia de segurança em andamento"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "O servidor está sendo instalado"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Sincronização de conteúdo em andamento"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Ações"
|
||||
},
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Cobranças anteriores"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Expira em {date}"
|
||||
},
|
||||
@@ -3155,12 +3218,6 @@
|
||||
"settings.billing.interval.monthly": {
|
||||
"message": "mensal"
|
||||
},
|
||||
"settings.billing.interval.quarter": {
|
||||
"message": "trimestre"
|
||||
},
|
||||
"settings.billing.interval.quarterly.adjective": {
|
||||
"message": "trimestral"
|
||||
},
|
||||
"settings.billing.interval.year": {
|
||||
"message": "ano"
|
||||
},
|
||||
@@ -3270,19 +3327,19 @@
|
||||
"message": "{gb} GB de RAM"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.text": {
|
||||
"message": "Ocorreu um erro ao reassinar o seu Modrinth server."
|
||||
"message": "Ocorreu um erro ao se reinscrever no seu Modrinth server."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Erro ao reassinar"
|
||||
"message": "Erro ao reativar a assinatura"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Se o servidor estiver cancelado no momento, a configuração pode levar de 10–15 minutos."
|
||||
"message": "Se o servidor estiver suspenso, pode levar até 10 minutos para que outra tentativa de cobrança seja feita."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Solicitação de reassinar enviada"
|
||||
"message": "Solicitação de reativação enviada"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.success.text": {
|
||||
"message": "Assinatura do servidor reassinada com sucesso"
|
||||
"message": "Assinatura do servidor reativada com sucesso"
|
||||
},
|
||||
"settings.billing.pyro.status.failed": {
|
||||
"message": "O pagamento da sua assinatura falhou. Por favor, atualize sua forma de pagamento, e tente assinar novamente."
|
||||
@@ -3306,7 +3363,7 @@
|
||||
"message": "Renova {date}"
|
||||
},
|
||||
"settings.billing.resubscribe": {
|
||||
"message": "Reassinar"
|
||||
"message": "Reativar assinatura"
|
||||
},
|
||||
"settings.billing.since": {
|
||||
"message": "Desde {date}"
|
||||
|
||||
@@ -1101,7 +1101,7 @@
|
||||
"message": "Sapo"
|
||||
},
|
||||
"hosting-marketing.available-locations": {
|
||||
"message": "Disponível na América do Norte, Europa e Ásia Sudeste para uma cobertura extensa."
|
||||
"message": "Disponível na América do Norte, Europa, e Ásia Sudeste para uma cobertura extensa."
|
||||
},
|
||||
"hosting-marketing.billing.monthly": {
|
||||
"message": "Pagar mensalmente"
|
||||
@@ -1119,13 +1119,13 @@
|
||||
"message": "Pagar anualmente"
|
||||
},
|
||||
"hosting-marketing.faq.burst-threads": {
|
||||
"message": "Como funcionam as threads de reforço das CPUs?"
|
||||
"message": "Como as threads de Turbo das CPUs funcionam?"
|
||||
},
|
||||
"hosting-marketing.faq.burst-threads.answer": {
|
||||
"message": "Quando o teu servidor está sob uma carga elevada, concedemos temporariamente acesso a threads de CPU adicionais para ajudar a mitigar picos de latência e instabilidade. Isto ajuda a evitar que o TPS desça abaixo dos 20, garantindo a experiência mais fluída possível. Como estes threads de CPU extra só estão disponíveis por um curto período durante períodos de elevada carga, podem não aparecer nos relatórios do Spark ou noutras ferramentas de perfilagem."
|
||||
},
|
||||
"hosting-marketing.faq.cpu-kind": {
|
||||
"message": "Os servidores do Modrinth Hosting utilizam que tipo de CPUs?"
|
||||
"message": "Que CPUs os servidores do Modrinth Hosting utilizam?"
|
||||
},
|
||||
"hosting-marketing.faq.cpu-kind.answer": {
|
||||
"message": "Os servidores Modrinth Hosting estão equipados com CPUs AMD Ryzen 7900 e equivalentes ao 7950X3D com uma frequência de 5+ GHz, juntamente com memória DDR5."
|
||||
@@ -1149,7 +1149,7 @@
|
||||
"message": "Quão rápidos são os servidores Modrinth Hosting?"
|
||||
},
|
||||
"hosting-marketing.faq.how-fast.answer.one": {
|
||||
"message": "Os servidores Modrinth Hosting estão alojados em hardware moderno e de alto desempenho. No entanto, é dificil dizer exatamente como isso se traduzirá no desempenho do teu servidor, uma vez que existem imensos fatores que o afetam, como os mods, pacotes de dados ou plugins que estás a utilizar no teu servidor, e até mesmo o comportamento dos utilizadores."
|
||||
"message": "Os servidores Modrinth Hosting estão alojados em hardware moderno de alto desempenho, mas é dificil dizer exatamente como isso se traduz para quão rápido o teu servidor vai correr porque existêm imensos fatores que o afetam, como os mods, pacotes de dados, ou plugins que estás a correr no teu servidor, e até o comportamento dos utilizadores."
|
||||
},
|
||||
"hosting-marketing.faq.how-fast.answer.two": {
|
||||
"message": "Maior parte dos problemas de desempenho que aparecem costumam ser causados por um modpack, mod, pacote de dados, ou plugin mal otimizado que provoca lentidão no servidor. Como os nossos servidores são de altíssima qualidade, não deverás ter muitos problemas, desde que escolhas um plano adequado ao conteúdo que estás a executar no servidor."
|
||||
@@ -1158,22 +1158,22 @@
|
||||
"message": "Posso aumentar o armazenamento do meu servidor?"
|
||||
},
|
||||
"hosting-marketing.faq.increase-storage.answer": {
|
||||
"message": "Sim, o armazenamento pode ser aumentado no teu servidor sem custos adicionais. Se precisares de mais espaço, contacta o suporte do Modrinth."
|
||||
"message": "Sim, armazenamento pode ser aumentado no teu servidor sem custo adicional. Se precisas de mais espaço, contacta o Suporte Modrinth."
|
||||
},
|
||||
"hosting-marketing.faq.location": {
|
||||
"message": "Onde estão localizados os servidores Modrinth Hosting? Posso escolher uma região?"
|
||||
},
|
||||
"hosting-marketing.faq.location.answer": {
|
||||
"message": "Temos servidores disponíveis na América do Norte, Europa e Ásia Sudeste, que podes escolher no momento da compra. Mais regiões serão adicionadas no futuro! Se quiseres trocar a tua região, entra em contacto com o suporte."
|
||||
"message": "Temos servidores disponíveis na América do Norte, Europa, e Ásia Sudeste no momento que podes escolher no momento da compra. Mais regiões estão para vir no futuro! Se gostarias de trocar a tua região, por favor contacta o suporte."
|
||||
},
|
||||
"hosting-marketing.faq.versions-loaders": {
|
||||
"message": "Que versões de Minecraft e loaders podem ser utilizados?"
|
||||
"message": "Que versões de Minecraft e carregadores podem ser utilizados?"
|
||||
},
|
||||
"hosting-marketing.faq.versions-loaders.answer.one": {
|
||||
"message": "Os servidores Modrinth Hosting podem executar qualquer versão de Minecraft: Java Edition voltando até à versão 1.2.5, incluindo versões snapshot."
|
||||
},
|
||||
"hosting-marketing.faq.versions-loaders.answer.two": {
|
||||
"message": "Também suportamos uma vasta gama de loaders de mods e plugins, incluindo Fabric, Quilt, Forge e NeoForge para mods, bem como Paper e Purpur para plugins. A disponibilidade depende da compatibilidade do loader de mods ou plugins com a versão selecionada do Minecraft."
|
||||
"message": "Também suportamos uma vasta gama de carregadores de mods e plugins, incluindo Fabric, Quilt, Forge e NeoForge para mods, bem como Paper e Purpur para plugins. A disponibilidade depende da compatibilidade do carregador de mods ou plugins com a versão selecionada do Minecraft."
|
||||
},
|
||||
"hosting-marketing.get-started": {
|
||||
"message": "Começar"
|
||||
@@ -1185,19 +1185,19 @@
|
||||
"message": "Começar um novo servidor"
|
||||
},
|
||||
"hosting-marketing.hero.button.start-your-server": {
|
||||
"message": "Cria o teu servidor"
|
||||
"message": "Começar o teu servidor"
|
||||
},
|
||||
"hosting-marketing.hero.host-with-modrinth": {
|
||||
"message": "Aloja o teu próximo servidor com o Modrinth Hosting"
|
||||
"message": "Aloja o teu próximo servidor com Modrinth Hosting"
|
||||
},
|
||||
"hosting-marketing.hero.hosting-description": {
|
||||
"message": "O Modrinth Hosting é a maneira mais fácil de teres o teu próprio servidor de Minecraft: Java Edition. Instala e joga os teus mods e modpacks favoritos, tudo na plataforma Modrinth."
|
||||
"message": "Modrinth Hosting é a maneira mais fácil de teres o teu próprio servidor de Minecraft: Java Edition. Instala e joga os teus mods e modpacks favoritos, tudo na plataforma Modrinth."
|
||||
},
|
||||
"hosting-marketing.included.advanced-networking": {
|
||||
"message": "Gestão de rede avançada"
|
||||
},
|
||||
"hosting-marketing.included.advanced-networking.description": {
|
||||
"message": "Adiciona o teu domínio ao teu servidor, reserva até 15 portas para mods que necessitem delas e muito mais."
|
||||
"message": "Adiciona o teu domínio ao teu servidor, reserva até 15 portas para mods que necessitem delas, e mais."
|
||||
},
|
||||
"hosting-marketing.included.backups-included": {
|
||||
"message": "Backups incluídos"
|
||||
@@ -1212,28 +1212,28 @@
|
||||
"message": "Partilha o teu servidor com um URL personalizado <contrast>modrinth.gg</contrast>."
|
||||
},
|
||||
"hosting-marketing.included.description": {
|
||||
"message": "Cada servidor inclui um conjunto de recursos concebidos para proporcionar uma experiência de alojamento que só o Modrinth pode oferecer."
|
||||
"message": "Cada servidor inclui um conjunto de funcionalidades concebidas para proporcionar uma experiência de alojamento que só Modrinth pode oferecer."
|
||||
},
|
||||
"hosting-marketing.included.file-manager": {
|
||||
"message": "Gestor de ficheiros fácil de usar"
|
||||
"message": "Gestor de arquivos fácil de usar"
|
||||
},
|
||||
"hosting-marketing.included.file-manager.description": {
|
||||
"message": "Procura, gere, edita, e envia ficheiros diretamente para o teu servidor facilmente."
|
||||
},
|
||||
"hosting-marketing.included.heading": {
|
||||
"message": "Vem com todos os recursos de que precisas."
|
||||
"message": "Vem com todas as funcionalidade que precisas."
|
||||
},
|
||||
"hosting-marketing.included.help": {
|
||||
"message": "Ajuda quando a mais precisares"
|
||||
"message": "Ajuda quando a mais precisas"
|
||||
},
|
||||
"hosting-marketing.included.help.description": {
|
||||
"message": "Contacta a equipa Modrinth sempre que precisares de ajuda com o teu servidor."
|
||||
},
|
||||
"hosting-marketing.included.powerful-console": {
|
||||
"message": "Uma consola poderosa, gestor de propriedades do servidor e muito mais"
|
||||
"message": "Uma consola poderosa, gestor de propriedades do servidor, e mais"
|
||||
},
|
||||
"hosting-marketing.included.powerful-console.description": {
|
||||
"message": "O Modrinth Hosting inclui ferramentas poderosas para gerires o teu servidor."
|
||||
"message": "Modrinth Hosting vem com ferramentas poderosas para gerires o teu servidor."
|
||||
},
|
||||
"hosting-marketing.included.sftp-access": {
|
||||
"message": "Acesso SFTP"
|
||||
@@ -1251,7 +1251,7 @@
|
||||
"message": "Testa um <orange>servidor de 3 GB</orange> grátis por 5 dias, fornecido por <orange>Medal</orange>"
|
||||
},
|
||||
"hosting-marketing.medal.learn-more": {
|
||||
"message": "Saber mais"
|
||||
"message": "Saber Mais"
|
||||
},
|
||||
"hosting-marketing.medal.text-secondary": {
|
||||
"message": "Oferta de tempo limitado. Cartão de crédito não necessário. Disponível para servidores EUA."
|
||||
@@ -1260,46 +1260,100 @@
|
||||
"message": "Escolhe um plano personalizado apenas com as especificações de que precisas."
|
||||
},
|
||||
"hosting-marketing.server-for-everyone": {
|
||||
"message": "Existe um servidor para todos"
|
||||
"message": "Existe um servidor para toda a gente"
|
||||
},
|
||||
"hosting-marketing.why.all-on-modrinth": {
|
||||
"message": "Gere tudo no Modrinth"
|
||||
},
|
||||
"hosting-marketing.why.all-on-modrinth.description": {
|
||||
"message": "O teu servidor, mods, jogadores e muito mais estão todos no Modrinth. Não precisas de alternar entre plataformas."
|
||||
"message": "O teu servidor, mods, jogadores, e mais estão todos no Modrinth. Não precisas alternar entre plataformas."
|
||||
},
|
||||
"hosting-marketing.why.consistently-fast": {
|
||||
"message": "Consistentemente rápido"
|
||||
},
|
||||
"hosting-marketing.why.consistently-fast.description": {
|
||||
"message": "A nossa infraestrutura nunca fica sobrecarregada, o que significa que todos os servidores alojados no Modrinth funcionam sempre com o máximo desempenho."
|
||||
"message": "A nossa infraestrutura nunca está sobrecarregada, o que significa que cada servidor alojado com Modrinth sempre está na sua performance máxima."
|
||||
},
|
||||
"hosting-marketing.why.description": {
|
||||
"message": "Escolhe entre os milhares de modpacks no Modrinth ou cria o teu próprio. Convida os teus amigos quando estiveres pronto para jogar."
|
||||
"message": "Escolhe dos milhares de modpacks no Modrinth ou cria o teu próprio. Convida os teus amigos quando estiveres pronto para jogar."
|
||||
},
|
||||
"hosting-marketing.why.heading": {
|
||||
"message": "Encontra um modpack. Agora é um servidor."
|
||||
},
|
||||
"hosting-marketing.why.modern-reliable-hosting": {
|
||||
"message": "Disfruta de um alojamento moderno e fiável"
|
||||
"message": "Experiencia um alojamento moderno e fiável"
|
||||
},
|
||||
"hosting-marketing.why.modern-reliable-hosting.description": {
|
||||
"message": "Os servidores Modrinth Hosting são alojados em <contrast>CPUs AMD de alto desempenho com memória RAM DDR5</contrast>, utilizando um software personalizado para garantir que o teu servidor funcione sem problemas."
|
||||
"message": "Servidores Modrinth Hosting são alojados em <contrast>CPUs AMD de alto desempenho com RAM DDR5</contrast>, executados em software personalizado para assegurar que o teu servidor não tenha problemas."
|
||||
},
|
||||
"hosting-marketing.why.where-mods-are": {
|
||||
"message": "Joga onde os teus mods estão"
|
||||
},
|
||||
"hosting-marketing.why.where-mods-are.description": {
|
||||
"message": "O Modrinth Hosting integra perfeitamente o processo de instalação de mods e modpacks no teu servidor."
|
||||
"message": "Modrinth Hosting integra perfeitamente o processo de instalação de mods e modpacks no seu servidor."
|
||||
},
|
||||
"hosting-marketing.why.why-modrinth-hosting": {
|
||||
"message": "Porquê escolher o Modrinth Hosting?"
|
||||
"message": "Porquê Modrinth Hosting?"
|
||||
},
|
||||
"hosting-marketing.why.your-favorite-mods": {
|
||||
"message": "Todos os teus mods favoritos"
|
||||
},
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Escolhe entre Vanilla, Fabric, Forge, Quilt e NeoForge. Se está no Modrinth, pode ser usado no teu servidor."
|
||||
"message": "Escolhe entre Vanilla, Fabric, Forge, Quilt e NeoForge. Se está no Modrinth, consegue correr no teu servidor."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Falha a mudar versão do modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Falha a carregar versões"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Falha a reinstalar modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Falha a reparar servidor"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Falha a redefinir servidor para ativação"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Falha a guardar definições de instalação"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Falha a desassociar modpack"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "Versão do {loader, select,null {carregador}other {{loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "A tua instalação do servidor foi reparada."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Reparação concluída"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Redefinir servidor"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Remove todos os dados no teu servidor, incluindo os teus mundos, mods, e ficheiros de configuração. Backups serão mantidos e podem ser restaurados."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Redefinir para ativação"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Isto vai colocar o servidor em modo de ativação para ser completada novamente. Tens a certeza que queres continuar?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Redefinir para ativação"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "O servidor foi colocado novamente no fluxo de ativação."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Servidor redefinido para ativação"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Opções de suporte"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Fora de stock"
|
||||
@@ -2217,7 +2271,7 @@
|
||||
"message": "Rever projeto"
|
||||
},
|
||||
"project.actions.servers-promo.description": {
|
||||
"message": "O Modrinth Hosting é a maneira mais fácil de jogar com os teus amigos sem complicações!"
|
||||
"message": "Modrinth Hosting é a maneira mais fácil de jogar com os teus amigos sem complicações!"
|
||||
},
|
||||
"project.actions.servers-promo.pricing": {
|
||||
"message": "A partir de {price}<small> / mês</small>"
|
||||
@@ -2772,11 +2826,23 @@
|
||||
"message": "Versão do jogo é fornecida pelo servidor"
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "O loader é fornecido pelo servidor"
|
||||
"message": "Carregador é fornecido pelo servidor"
|
||||
},
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Sincronizar com o servidor"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Criação de backup em curso"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Restauro de backup em curso"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Servidor a ser instalado"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Sincronização de conteúdo em progresso"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Ações"
|
||||
},
|
||||
@@ -3113,39 +3179,18 @@
|
||||
"settings.authorizations.by": {
|
||||
"message": "por"
|
||||
},
|
||||
"settings.authorizations.description": {
|
||||
"message": "Quando autorizas uma aplicação com a tua conta Modrinth, dás-lhe acesso à tua conta. Podes gerir e rever acesso à tua conta aqui quando quiseres."
|
||||
},
|
||||
"settings.authorizations.empty-state": {
|
||||
"message": "Neste momento, não conseguimos mostrar as tuas aplicações autorizadas, estamos a tentar corrigir isto. Por favor tenta novamente mais tarde!"
|
||||
},
|
||||
"settings.authorizations.head-title": {
|
||||
"message": "Autorizações"
|
||||
},
|
||||
"settings.authorizations.revoke.action": {
|
||||
"message": "Revogar"
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.description": {
|
||||
"message": "Isto irá revogar o acesso desta aplicação à tua conta. Podes sempre reautorizá-la no futuro."
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.title": {
|
||||
"message": "Tens a certeza de que queres revogar esta aplicação?"
|
||||
},
|
||||
"settings.billing.charges.description": {
|
||||
"message": "Todas as cobranças passadas na tua conta Modrinth são listadas aqui:"
|
||||
},
|
||||
"settings.billing.charges.product.medal-trial": {
|
||||
"message": "Teste de Servidor por Medal"
|
||||
},
|
||||
"settings.billing.charges.product.midas": {
|
||||
"message": "Modrinth Plus"
|
||||
},
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Pagamentos anteriores"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Expira em {date}"
|
||||
},
|
||||
@@ -3161,39 +3206,9 @@
|
||||
"settings.billing.interval.yearly": {
|
||||
"message": "anual"
|
||||
},
|
||||
"settings.billing.midas.benefits.ad-free": {
|
||||
"message": "Navegação sem anúncios em modrinth.com e Modrinth App"
|
||||
},
|
||||
"settings.billing.midas.benefits.badge": {
|
||||
"message": "Distintivo Modrinth+ no teu perfil"
|
||||
},
|
||||
"settings.billing.midas.benefits.support": {
|
||||
"message": "Suporta o Modrinth e criadores diretamente"
|
||||
},
|
||||
"settings.billing.midas.benefits.title": {
|
||||
"message": "Benefícios"
|
||||
},
|
||||
"settings.billing.midas.save-per-year": {
|
||||
"message": "Poupa {amount}/ano ao trocar para a cobrança anual!"
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line1": {
|
||||
"message": "Tu cancelaste a tua subscrição."
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line2": {
|
||||
"message": "Os teus benefícios mantêm-se até ao final do atual ciclo de faturação."
|
||||
},
|
||||
"settings.billing.midas.status.failed": {
|
||||
"message": "O pagamento da tua subscrição falhou. Por favor atualiza o teu método de pagamento."
|
||||
},
|
||||
"settings.billing.midas.status.open": {
|
||||
"message": "Estás atualmente subscrito a:"
|
||||
},
|
||||
"settings.billing.midas.status.processing": {
|
||||
"message": "O teu pagamento está a ser processado. Os benefícios serão ativados quando o pagamento for concluído."
|
||||
},
|
||||
"settings.billing.midas.upsell": {
|
||||
"message": "Torna-te um subscritor de Modrinth Plus!"
|
||||
},
|
||||
"settings.billing.modal.cancel.action": {
|
||||
"message": "Cancelar subscrição"
|
||||
},
|
||||
@@ -3248,38 +3263,11 @@
|
||||
"settings.billing.price.slash-interval": {
|
||||
"message": "/{interval}"
|
||||
},
|
||||
"settings.billing.pyro.cpu": {
|
||||
"message": "{shared} CPUs partilhadas (Reforço até {bursts} CPUs)"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.not-found": {
|
||||
"message": "Um servidor associado a esta subscrição não foi encontrado. Podem existir algumas explicações possíveis para isto. Se acabaste de comprar o teu servidor, isto é normal. Pode levar até uma hora para o teu servidor ser provisionado. Caso contrário, se compraste este servidor a algum tempo, é provável que desde então tenha sido suspenso. Se isto não é o que estavas à espera, por favor contacta o Suporte Modrinth com a informação seguinte:"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.server-id": {
|
||||
"message": "ID do servidor: {id}"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.stripe-id": {
|
||||
"message": "ID do Stripe: {id}"
|
||||
},
|
||||
"settings.billing.pyro.ram": {
|
||||
"message": "{gb} GB de RAM"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.text": {
|
||||
"message": "Ocorreu um erro ao tentar resubscrever ao teu servidor Modrinth."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Erro ao ressubscrever"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Pedido de ressubscrição enviado"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.success.text": {
|
||||
"message": "Subscrição de servidor ressubscrita com sucesso"
|
||||
},
|
||||
"settings.billing.pyro.status.failed": {
|
||||
"message": "O pagamento da tua subscrição falhou. Por favor atualiza o teu método de pagamento, e então ressubscreve."
|
||||
"message": "{gb} GB RAM"
|
||||
},
|
||||
"settings.billing.pyro.storage": {
|
||||
"message": "{gb} GB de SSD"
|
||||
"message": "{gb} GB SSD"
|
||||
},
|
||||
"settings.billing.pyro.swap": {
|
||||
"message": "{gb} GB Swap"
|
||||
@@ -3294,7 +3282,7 @@
|
||||
"message": "Renova a {date}"
|
||||
},
|
||||
"settings.billing.resubscribe": {
|
||||
"message": "Ressubscrever"
|
||||
"message": "Resubscrever"
|
||||
},
|
||||
"settings.billing.since": {
|
||||
"message": "Desde {date}"
|
||||
@@ -3308,15 +3296,6 @@
|
||||
"settings.billing.subscription.title": {
|
||||
"message": "Subscrições"
|
||||
},
|
||||
"settings.billing.switch.switching-to-interval": {
|
||||
"message": "Alterando para {interval}"
|
||||
},
|
||||
"settings.billing.switch.to-interval": {
|
||||
"message": "Alterar para {interval}"
|
||||
},
|
||||
"settings.billing.update-method": {
|
||||
"message": "Atualizar método"
|
||||
},
|
||||
"settings.billing.upgrade": {
|
||||
"message": "Melhorar"
|
||||
},
|
||||
|
||||
@@ -1293,14 +1293,56 @@
|
||||
"message": "Установка модов и сборок встроена в Modrinth Hosting и работает прямо на сервере."
|
||||
},
|
||||
"hosting-marketing.why.why-modrinth-hosting": {
|
||||
"message": "Почему именно Modrinth Hosting?"
|
||||
"message": "Преимущества Modrinth Hosting"
|
||||
},
|
||||
"hosting-marketing.why.your-favorite-mods": {
|
||||
"message": "Все ваши любимые моды"
|
||||
"message": "Все самые любимые моды"
|
||||
},
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Выбирайте Fabric, Forge, Quilt, NeoForge или сервер без модов. Всё, что есть на Modrinth, работает на сервере."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Не удалось загрузить версии наборов модов"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Не удалось загрузить версии"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Не удалось переустановить набор модов"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Не удалось восстановить сервер"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Не удалось сохранить установочные настройки"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Не удалось отвязать набор модов"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Версия загрузчика} other {Версия {loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Установка вашего сервера была восстановлена."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Восстановление завершено"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Сбросить сервер"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Удаляет все данные сервера, включая миры, моды и файлы настроек. Резервные копии останутся и их можно будет восстановить."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Это действие вернет сервер на этап изначальной настройки для её повторного прохождения. Вы уверены, что хотите продолжить?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Вернуть к изначальным настройкам"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Настройки поддержки"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Нет в наличии"
|
||||
},
|
||||
@@ -2430,25 +2472,25 @@
|
||||
"message": "Не удалось найти {item, select, project {проект} version {версию} user {пользователя} other {контент}}"
|
||||
},
|
||||
"report.for.violation": {
|
||||
"message": "На нарушение наших <rules-link>правил</rules-link> или <terms-link>условий</terms-link>"
|
||||
"message": "Нарушение наших <rules-link>правил</rules-link> или <terms-link>условий</terms-link>"
|
||||
},
|
||||
"report.for.violation.description": {
|
||||
"message": "Спам, оскорбления, обман, вредоносный или незаконный контент."
|
||||
},
|
||||
"report.form-not-for": {
|
||||
"message": "Для чего не предназначена форма"
|
||||
"message": "Для чего не предназначена форма:"
|
||||
},
|
||||
"report.go-to-report": {
|
||||
"message": "Перейти к жалобе"
|
||||
},
|
||||
"report.not-for.bug-reports": {
|
||||
"message": "Для сообщения об ошибках"
|
||||
"message": "Отчёты об ошибках"
|
||||
},
|
||||
"report.not-for.bug-reports.description": {
|
||||
"message": "Сообщайте об ошибках в <issues-link>трекере проекта</issues-link>."
|
||||
},
|
||||
"report.not-for.dmca": {
|
||||
"message": "Для удаления по DMCA"
|
||||
"message": "Нарушение DMCA"
|
||||
},
|
||||
"report.not-for.dmca.description": {
|
||||
"message": "Ознакомьтесь с нашей <policy-link>политикой авторских прав</policy-link>."
|
||||
@@ -2466,7 +2508,7 @@
|
||||
"message": "Отчёты от Microsoft Defender, VirusTotal или Систем обнаружения вредоносного ПО не считаются доказательством и рассматриваться не будут."
|
||||
},
|
||||
"report.please-report": {
|
||||
"message": "На что жаловаться"
|
||||
"message": "На что жаловаться:"
|
||||
},
|
||||
"report.question.content-id": {
|
||||
"message": "Какой ID у {item, select, project {проекта} version {версии} user {пользователя} other {контента}}?"
|
||||
@@ -2777,6 +2819,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Использовать с сервера"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Резервное копирование в процессе"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Восстановление из резервной копии в процессе"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Сервер устанавливается"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Синхронизация контента в процессе"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Действия"
|
||||
},
|
||||
@@ -3054,7 +3108,7 @@
|
||||
"message": "Удалить это приложение"
|
||||
},
|
||||
"settings.applications.delete.confirm.description": {
|
||||
"message": "Это приложение и все его токены доступа будут удалены навсегда. (безвозвратно!)"
|
||||
"message": "Приложение будет удалено навсегда, и все токены доступа перестанут работать. (безвозвратно!)"
|
||||
},
|
||||
"settings.applications.delete.confirm.title": {
|
||||
"message": "Вы действительно хотите удалить это приложение?"
|
||||
@@ -3143,9 +3197,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "История списаний"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Истекает {date}"
|
||||
},
|
||||
@@ -3155,12 +3206,6 @@
|
||||
"settings.billing.interval.monthly": {
|
||||
"message": "ежемесячно"
|
||||
},
|
||||
"settings.billing.interval.quarter": {
|
||||
"message": "3 месяца"
|
||||
},
|
||||
"settings.billing.interval.quarterly.adjective": {
|
||||
"message": "3 месяца"
|
||||
},
|
||||
"settings.billing.interval.year": {
|
||||
"message": "год"
|
||||
},
|
||||
@@ -3222,7 +3267,7 @@
|
||||
"message": "Далее:"
|
||||
},
|
||||
"settings.billing.or-yearly-save": {
|
||||
"message": "Или {price} в год (экономия {percent}%)"
|
||||
"message": "Или {price} / год (экономия {percent}%)"
|
||||
},
|
||||
"settings.billing.payment_method.action.add": {
|
||||
"message": "Добавить способ оплаты"
|
||||
@@ -3249,7 +3294,7 @@
|
||||
"message": "{size} план"
|
||||
},
|
||||
"settings.billing.price.per-interval": {
|
||||
"message": "{price} в {interval}"
|
||||
"message": "{price} / {interval}"
|
||||
},
|
||||
"settings.billing.price.slash-interval": {
|
||||
"message": "/{interval}"
|
||||
@@ -3258,28 +3303,31 @@
|
||||
"message": "{shared, plural, one {# разделяемый} other {# разделяемых}} CPU (временный рост до {bursts} CPU)"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.not-found": {
|
||||
"message": "Привязанный сервер не найден. Возможных причин несколько: сервер куплен только что — подождите, подготовка занимает до часа; сервер куплен давно — вероятно, его уже приостановили. Если что‑то не так, свяжитесь с поддержкой Modrinth, указав следующие данные:"
|
||||
"message": "Для этой подписки не удалось найти связанный сервер. Этому есть несколько возможных объяснений. Если вы только что приобрели сервер, это нормально. Подготовка сервера может занять до часа. В противном случае, если вы приобрели этот сервер некоторое время назад, он, вероятно, уже приостановлен. Если это не то, чего вы ожидали, пожалуйста, свяжитесь со службой поддержки Modrinth, предоставив следующую информацию:"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.server-id": {
|
||||
"message": "ID сервера: {id}"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.stripe-id": {
|
||||
"message": "ID Stripe: {id}"
|
||||
"message": "Stripe ID: {id}"
|
||||
},
|
||||
"settings.billing.pyro.ram": {
|
||||
"message": "{gb} ГБ ОЗУ"
|
||||
"message": "{gb} ГБ RAM"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.text": {
|
||||
"message": "Произошла ошибка при возобновлении подписки на сервер Modrinth."
|
||||
"message": "Произошла ошибка при повторной подписке Modrinth server."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Не удалось возобновить подписку"
|
||||
"message": "Ошибка при повторной подписке"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Если сервер в данный момент приостановлен, повторная попытка списания средств может занять до 10 минут."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Подписка возобновляется"
|
||||
"message": "Запрос на повторную подписку отправлен"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.success.text": {
|
||||
"message": "Подписка на сервер успешно возобновлена"
|
||||
"message": "Подписка на сервер успешно продлена"
|
||||
},
|
||||
"settings.billing.pyro.status.failed": {
|
||||
"message": "Платёж не прошёл. Обновите способ оплаты и возобновите подписку."
|
||||
@@ -3327,7 +3375,7 @@
|
||||
"message": "Ежемесячная оплата обойдётся на {amount} в год дороже"
|
||||
},
|
||||
"settings.billing.switches-to-billing-on": {
|
||||
"message": "{interval, select, ежемесячно {Ежемесячная оплата} ежегодно {Ежегодная оплата} 3 месяца {Оплата раз в 3 месяца} other {{interval} оплата}} с {date}"
|
||||
"message": "{interval, select, ежемесячно {Ежемесячная} ежегодно {Ежегодная} other {{interval}}} оплата с {date}"
|
||||
},
|
||||
"settings.billing.update-method": {
|
||||
"message": "Обновить способ"
|
||||
@@ -3339,25 +3387,25 @@
|
||||
"message": "Отключить режим разработчика"
|
||||
},
|
||||
"settings.display.banner.developer-mode.description": {
|
||||
"message": "<strong>Режим разработчика</strong> включён. Отображаются внутренние идентификаторы различных элементов сайта, что удобно при работе с API. Чтобы отключить, снова нажмите на логотип Modrinth внизу страницы 5 раз."
|
||||
"message": "<strong>Режим разработчика</strong> включён. Отображаются внутренние идентификаторы различных частей Modrinth, что может пригодиться при работе с API. Чтобы включить или отключить режим разработчика, нажмите на логотип Modrinth внизу страницы 5 раз."
|
||||
},
|
||||
"settings.display.flags.description": {
|
||||
"message": "Настройте отдельные функции на этом устройстве."
|
||||
"message": "Включите или отключите определённые функции на этом устройстве."
|
||||
},
|
||||
"settings.display.flags.title": {
|
||||
"message": "Настройка функций"
|
||||
"message": "Переключение функций"
|
||||
},
|
||||
"settings.display.notification.developer-mode-deactivated.text": {
|
||||
"message": "Режим разработчика больше не активен"
|
||||
"message": "Режим разработчика отключен"
|
||||
},
|
||||
"settings.display.notification.developer-mode-deactivated.title": {
|
||||
"message": "Режим разработчика отключён"
|
||||
"message": "Режим разработчика отключен"
|
||||
},
|
||||
"settings.display.project-list-layouts.datapack": {
|
||||
"message": "Страница наборов данных"
|
||||
},
|
||||
"settings.display.project-list-layouts.description": {
|
||||
"message": "Выберите вид для каждой страницы с проектами на этом устройстве."
|
||||
"message": "Выберите макет для каждой страницы с проектами на этом устройстве."
|
||||
},
|
||||
"settings.display.project-list-layouts.mod": {
|
||||
"message": "Страница модов"
|
||||
@@ -3387,7 +3435,7 @@
|
||||
"message": "Страница шейдеров"
|
||||
},
|
||||
"settings.display.project-list-layouts.title": {
|
||||
"message": "Вид проектов"
|
||||
"message": "Представление проектов"
|
||||
},
|
||||
"settings.display.project-list-layouts.user": {
|
||||
"message": "Страницы пользователей"
|
||||
@@ -3396,16 +3444,16 @@
|
||||
"message": "Коллекция"
|
||||
},
|
||||
"settings.display.sidebar.advanced-rendering.description": {
|
||||
"message": "Включает продвинутые эффекты вроде размытия. Возможно снижение производительности на устройствах без аппаратного ускорения."
|
||||
"message": "Включает продвинутые эффекты наподобие размытия фона, которые могут понизить производительность на устройствах без аппаратного ускорения графики."
|
||||
},
|
||||
"settings.display.sidebar.advanced-rendering.title": {
|
||||
"message": "Расширенные эффекты"
|
||||
"message": "Особые эффекты"
|
||||
},
|
||||
"settings.display.sidebar.external-links-new-tab.description": {
|
||||
"message": "Ссылки за пределы Modrinth будут открываться в новой вкладке. Исключения: ссылки внутри домена и в Markdown — всегда в той же вкладке; реклама и страницы редактирования — всегда в новой."
|
||||
"message": "Ссылки, ведущие за пределы Modrinth, будут открываться в новой вкладке. Независимо от этой настройки, ссылки на тот же домен и в описаниях Markdown будут открываться в той же вкладке, а ссылки на рекламные объявления и редактирование страниц — в новой вкладке."
|
||||
},
|
||||
"settings.display.sidebar.external-links-new-tab.title": {
|
||||
"message": "Внешние ссылки в новой вкладке"
|
||||
"message": "Открывать внешние ссылки в новой вкладке"
|
||||
},
|
||||
"settings.display.sidebar.hide-app-promos.description": {
|
||||
"message": "Убирает кнопку «Скачать Modrinth App» с поисковых страниц. Ссылку на раздел с Modrinth App всё ещё можно найти на главной странице или в нижней части интерфейса."
|
||||
@@ -3414,16 +3462,16 @@
|
||||
"message": "Скрывать кнопку скачивания Modrinth App"
|
||||
},
|
||||
"settings.display.sidebar.left-aligned-content-sidebar.title": {
|
||||
"message": "Панель сведений слева"
|
||||
"message": "Отображать боковую панель страниц контента слева"
|
||||
},
|
||||
"settings.display.sidebar.right-aligned-content-sidebar.description": {
|
||||
"message": "Помещает панель сведений слева от содержимого страницы."
|
||||
"message": "Помещает боковую панель слева от содержимого страницы."
|
||||
},
|
||||
"settings.display.sidebar.right-aligned-filters-sidebar.description": {
|
||||
"message": "Помещает панель фильтров справа от результатов поиска."
|
||||
"message": "Помещает боковую панель с фильтрами справа от результатов поиска."
|
||||
},
|
||||
"settings.display.sidebar.right-aligned-filters-sidebar.title": {
|
||||
"message": "Панель фильтров справа"
|
||||
"message": "Отображать боковую панель фильтров поиска справа"
|
||||
},
|
||||
"settings.display.theme.description": {
|
||||
"message": "Выберите тему для Modrinth на этом устройстве."
|
||||
|
||||
@@ -881,9 +881,6 @@
|
||||
"dashboard.withdraw.completion.date": {
|
||||
"message": "Datum"
|
||||
},
|
||||
"dashboard.withdraw.completion.exchange-rate": {
|
||||
"message": "Växelkurs"
|
||||
},
|
||||
"dashboard.withdraw.completion.fee": {
|
||||
"message": "Avgift"
|
||||
},
|
||||
@@ -893,24 +890,12 @@
|
||||
"dashboard.withdraw.completion.net-amount": {
|
||||
"message": "Nettoantal"
|
||||
},
|
||||
"dashboard.withdraw.completion.recipient": {
|
||||
"message": "Mottagare"
|
||||
},
|
||||
"dashboard.withdraw.completion.title": {
|
||||
"message": "Uttag lyckades"
|
||||
},
|
||||
"dashboard.withdraw.completion.transactions-button": {
|
||||
"message": "Transaktioner"
|
||||
},
|
||||
"dashboard.withdraw.completion.wallet": {
|
||||
"message": "Saldo"
|
||||
},
|
||||
"dashboard.withdraw.error.account-not-linked.text": {
|
||||
"message": "Vänligen länka ditt betalkonto före uttag."
|
||||
},
|
||||
"dashboard.withdraw.error.account-not-linked.title": {
|
||||
"message": "Konto inte länkat"
|
||||
},
|
||||
"dashboard.withdraw.error.insufficient-balance.title": {
|
||||
"message": "Otillräcklig saldo"
|
||||
},
|
||||
@@ -1226,6 +1211,18 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Välja mellan Vanilla, Fabric, Forge; Quilt och NeoForge. Om det finns på Modrinth så kan din server köra det."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Misslyckades med att ändra modpaketets version"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Kunde inte ominstallera modpaket"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Kunde inte avlänka modpaketet"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Återställ server"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Ej i lager"
|
||||
},
|
||||
@@ -1358,9 +1355,6 @@
|
||||
"landing.section.for-players.label": {
|
||||
"message": "För spelare"
|
||||
},
|
||||
"landing.section.for-players.tagline": {
|
||||
"message": "Upptäck över {count, number} kreationer"
|
||||
},
|
||||
"landing.subheading": {
|
||||
"message": "Upptäck, spela och dela Minecraft-innehåll via vår plattform med öppen källkod som skapades för communityn."
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,45 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Vanilla, Fabric, Forge, Quilt ve NeoForge arasından seçin. Modrinth'de varsa sunucunuzda çalışır."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Modpaketi sürümü değiştirilemedi"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Sürümler yüklenemedi"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Mod paketi yeniden yüklenemedi"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Sunucu tamiri başarısız oldu"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Sunucu başlangıç ayarlarına sıfırlanamadı"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Kurulum ayarları kaydedilemedi"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Mod paketi bağlantısı kaldırılamadı"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {Yükleyici} other {Yükleyici}} sürüm"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Sunucu kurulumunuz başarıyla onarıldı."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Tamir tamamlandı"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Sunucuyu sıfırla"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Sunucunuzdaki tüm verileri, dünyalarınızı, modları ve yapılandırma dosyalarınızı siler. Yedekler korunur ve geri yüklenebilir."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Kurulum aşamasına sıfırla"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Stokta yok"
|
||||
},
|
||||
|
||||
@@ -978,13 +978,13 @@
|
||||
"message": "Надані вами банківські реквізити недійсні. Будь ласка, перевірте свою інформацію."
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-bank.title": {
|
||||
"message": "Хибні банківські реквізити"
|
||||
"message": "Недійсні банківські реквізити"
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-wallet.text": {
|
||||
"message": "Указана вами адреса криптогаманця недійсна. Будь ласка, перевірте ще раз і спробуйте ще раз."
|
||||
"message": "Вказана вами адреса криптогаманця недійсна. Будь ласка, перевірте ще раз і спробуйте ще раз."
|
||||
},
|
||||
"dashboard.withdraw.error.invalid-wallet.title": {
|
||||
"message": "Хибна адреса гаманця"
|
||||
"message": "Недійсна адреса гаманця"
|
||||
},
|
||||
"dashboard.withdraw.error.minimum-not-met.text": {
|
||||
"message": "Сума виведення (після комісій) не відповідає мінімальній вимозі. Будь ласка, збільште суму виведення."
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Вибирайте між ванільною грою, Fabric, Forge, Quilt і NeoForge. Якщо воно є Modrinth — значить воно працюватиме на вашому сервері."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Не вдалося змінити версію збірки"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Не вдалося завантажити версії"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Не вдалося перевстановити збірку"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Не вдалося полагодити сервер"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "Не вдалося скинути до початкового стану"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Не вдалося зберегти налаштування інсталяції"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Не вдалося відв’язати збірку"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "Версія {loader, select, null {завантажувача} other {{loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Інсталяція вашого сервера була полагоджена."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Лагодження завершено"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Скинути сервер"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Видаляє всі дані на вашому сервері, включаючи світи, моди та файли налаштувань. Резервні копії збережуться, і їх можна буде відновити."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "Скинути до початкового стану"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "Це призведе до повернення сервера в початковий стан, щоб можна було повторно виконати процес налаштування. Ви впевнені, що хочете продовжити?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "Скинути до початкового стану"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "Сервер повернуто до початкового стану для налаштування."
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "Сервер скинуто до початкового стану"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "Налаштування підтримки"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Немає в наявності"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Синхронізувати з сервером"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Триває створення резервної копії"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Триває відновлення резервної копії"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Сервер установлюється"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Триває синхронізація вмісту"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Дії"
|
||||
},
|
||||
@@ -2826,7 +2892,7 @@
|
||||
"message": "Створення файлу експорту…"
|
||||
},
|
||||
"settings.account.data-export.description": {
|
||||
"message": "Запросіть копіювання всіх ваших персональних даних, які ви завантажили на Modrinth. Це може зайняти деякий час."
|
||||
"message": "Запросити копіювання всіх ваших персональних даних які ви завантажили но Modrinth. Це може зайняти деякий час."
|
||||
},
|
||||
"settings.account.data-export.title": {
|
||||
"message": "Експорт даних"
|
||||
@@ -2958,7 +3024,7 @@
|
||||
"message": "Керувати сервісами"
|
||||
},
|
||||
"settings.account.security.providers.description": {
|
||||
"message": "Додайте або приберіть способи входу для вашого облікового запису, зокрема GitHub, GitLab, Microsoft, Discord, Steam і Google."
|
||||
"message": "Додати або прибрати способи входу для вашого облікового запису, зокрема GitHub, GitLab, Microsoft, Discord, Steam і Google."
|
||||
},
|
||||
"settings.account.security.providers.title": {
|
||||
"message": "Керування сервісами входу"
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "Останні списання"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "Сплине {date}"
|
||||
},
|
||||
@@ -3155,12 +3218,6 @@
|
||||
"settings.billing.interval.monthly": {
|
||||
"message": "щомісячно"
|
||||
},
|
||||
"settings.billing.interval.quarter": {
|
||||
"message": "квартал"
|
||||
},
|
||||
"settings.billing.interval.quarterly.adjective": {
|
||||
"message": "щоквартально"
|
||||
},
|
||||
"settings.billing.interval.year": {
|
||||
"message": "рік"
|
||||
},
|
||||
@@ -3276,7 +3333,7 @@
|
||||
"message": "Помилка поновлення підписки"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Якщо сервер наразі скасовано, налаштування сервера може зайняти 10-15 хвилин."
|
||||
"message": "Якщо сервер наразі призупинено, повторна спроба оплати може зайняти до 10 хвилин."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Запит на поновлення підписки надіслано"
|
||||
|
||||
@@ -1301,6 +1301,39 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "Chọn giữa phiên bản gốc (Vanilla), Fabric, Forge, Quilt và NeoForge. Nếu chúng có trên Modrinth, chúng sẽ hoạt động trên máy chủ của bạn."
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "Thay đổi phiên bản modpack thất bại"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "Lỗi tải phiên bản"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "Không thể cài đặt lại modpack"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "Sửa chữa máy chủ thất bại"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "Lưu cấu hình cài đặt thất bại"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "Lỗi ngắt liên kết modpack"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "Phiên bản {loader, select, null {Loader} other {{loader}}}"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "Bản cài đặt máy chủ của bạn đã được sửa chữa."
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "Hoàn tất sửa chữa"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "Khởi động lại máy chủ"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "Xóa toàn bộ dữ liệu trên máy chủ của bạn, bao gồm thế giới, các bản mod và tệp cấu hình. Các bản sao lưu sẽ được giữ lại và có thể khôi phục."
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "Hết hàng"
|
||||
},
|
||||
@@ -2777,6 +2810,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "Đồng bộ với máy chủ"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "Đang tiến hành tạo bản sao lưu"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "Đang khôi phục bản sao lưu"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "Đang cài đặt máy chủ"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "Đang đồng bộ hóa nội dung"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "Hành động"
|
||||
},
|
||||
@@ -3266,6 +3311,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "Xảy ra lỗi đăng ký lại"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Nếu máy chủ hiện đang bị đình chỉ, có thể mất tối đa 10 phút để thực hiện một lần thử tính phí khác."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Yêu cầu đăng ký lại đã được gửi"
|
||||
},
|
||||
|
||||
@@ -1301,6 +1301,60 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "随心选择原版、Fabric、Forge、Quilt 和 NeoForge。只要它在 Modrinth,你的服务器就能运行它。"
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "更改整合包版本失败"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "加载版本失败"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "重新下载整合包失败"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "修复服务器失败"
|
||||
},
|
||||
"hosting.loader.failed-to-reset-to-onboarding": {
|
||||
"message": "将服务器重置至引导流程失败"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "保存安装设置失败"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "链接整合包包失败"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {加载器} other {{loader}}} 版本"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "你的服务器安装已被修复。"
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "修复完成"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "重置服务器"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "删除服务器上的所有数据,包括你的世界、模组和配置文件。备份将保留并可以恢复。"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-button": {
|
||||
"message": "重置至引导流程"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-description": {
|
||||
"message": "这将使服务器重新进入引导流程,以便再次完成设置。你确定要继续吗?"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-modal-title": {
|
||||
"message": "重置至引导流程"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-description": {
|
||||
"message": "服务器已返回至引导流程。"
|
||||
},
|
||||
"hosting.loader.reset-to-onboarding-success-title": {
|
||||
"message": "服务器已重置至引导流程"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "支持选项"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "缺货"
|
||||
},
|
||||
@@ -2777,6 +2831,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "跟随服务器"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "备份正在创建中"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "备份正在恢复"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "正在安装服务器"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "进行内容同步中"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "操作"
|
||||
},
|
||||
@@ -3135,7 +3201,7 @@
|
||||
"message": "你过去所有支付给Modrinth账户的款项都将列在这里:"
|
||||
},
|
||||
"settings.billing.charges.product.medal-trial": {
|
||||
"message": "Medal 服务器试用"
|
||||
"message": "服务器试用版"
|
||||
},
|
||||
"settings.billing.charges.product.midas": {
|
||||
"message": "Modrinth Plus"
|
||||
@@ -3143,9 +3209,6 @@
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth托管服务"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "过去费用"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "有效期至{date}"
|
||||
},
|
||||
@@ -3269,6 +3332,9 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "重新订阅时出错"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "如果服务器当前已暂停,再次尝试扣费可能最多需要10分钟。"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "重新订阅请求已提交"
|
||||
},
|
||||
@@ -3522,13 +3588,13 @@
|
||||
"message": "未知平台"
|
||||
},
|
||||
"settings.sidebar.label.account": {
|
||||
"message": "账户设置"
|
||||
"message": "账户选项"
|
||||
},
|
||||
"settings.sidebar.label.developer": {
|
||||
"message": "开发者设置"
|
||||
"message": "开发者选项"
|
||||
},
|
||||
"settings.sidebar.label.display": {
|
||||
"message": "显示设置"
|
||||
"message": "显示选项"
|
||||
},
|
||||
"ui.latest-news-row.latest-news": {
|
||||
"message": "Modrinth 的最新消息"
|
||||
|
||||
@@ -198,13 +198,13 @@
|
||||
"message": "更多下載選項"
|
||||
},
|
||||
"app-marketing.hide-other-packages": {
|
||||
"message": "隱藏其他軟體包"
|
||||
"message": "隱藏其他套件"
|
||||
},
|
||||
"app-marketing.not-recommended": {
|
||||
"message": "除非你清楚自己在做什麼,否則我們不建議使用這些軟體包。"
|
||||
"message": "除非你清楚自己在做什麼,否則我們不建議使用這些套件。"
|
||||
},
|
||||
"app-marketing.show-other-packages": {
|
||||
"message": "顯示其他軟體包"
|
||||
"message": "顯示其他套件"
|
||||
},
|
||||
"auth.authorize.action.authorize": {
|
||||
"message": "授權"
|
||||
@@ -1301,6 +1301,42 @@
|
||||
"hosting-marketing.why.your-favorite-mods.description": {
|
||||
"message": "自由選擇原版、Fabric、Forge、Quilt 或 NeoForge。只要在 Modrinth 上找得到的,都能在你的伺服器上執行。"
|
||||
},
|
||||
"hosting.loader.failed-to-change-version": {
|
||||
"message": "無法變更模組包版本"
|
||||
},
|
||||
"hosting.loader.failed-to-load-versions": {
|
||||
"message": "無法載入版本"
|
||||
},
|
||||
"hosting.loader.failed-to-reinstall": {
|
||||
"message": "無法重新安裝模組包"
|
||||
},
|
||||
"hosting.loader.failed-to-repair": {
|
||||
"message": "無法修復伺服器"
|
||||
},
|
||||
"hosting.loader.failed-to-save-settings": {
|
||||
"message": "無法儲存安裝設定"
|
||||
},
|
||||
"hosting.loader.failed-to-unlink": {
|
||||
"message": "無法取消連結模組包"
|
||||
},
|
||||
"hosting.loader.loader-version": {
|
||||
"message": "{loader, select, null {載入器} other {{loader}}} 版本"
|
||||
},
|
||||
"hosting.loader.repair-started-text": {
|
||||
"message": "你的伺服器安裝已修復。"
|
||||
},
|
||||
"hosting.loader.repair-started-title": {
|
||||
"message": "修復完成"
|
||||
},
|
||||
"hosting.loader.reset-server": {
|
||||
"message": "重設伺服器"
|
||||
},
|
||||
"hosting.loader.reset-server-description": {
|
||||
"message": "將刪除你伺服器上的所有資料,包括你的世界、模組以及設定檔。備份將保留,並可供還原。"
|
||||
},
|
||||
"hosting.loader.support-options-title": {
|
||||
"message": "支援選項"
|
||||
},
|
||||
"hosting.plan.out-of-stock": {
|
||||
"message": "缺貨"
|
||||
},
|
||||
@@ -2777,6 +2813,18 @@
|
||||
"search.filter.locked.server.sync": {
|
||||
"message": "與伺服器同步"
|
||||
},
|
||||
"servers.busy.backup-creating": {
|
||||
"message": "正在建立備份"
|
||||
},
|
||||
"servers.busy.backup-restoring": {
|
||||
"message": "正在還原備份"
|
||||
},
|
||||
"servers.busy.installing": {
|
||||
"message": "正在安裝伺服器"
|
||||
},
|
||||
"servers.busy.syncing-content": {
|
||||
"message": "正在同步內容"
|
||||
},
|
||||
"servers.notice.actions": {
|
||||
"message": "動作"
|
||||
},
|
||||
@@ -2972,45 +3020,15 @@
|
||||
"settings.account.security.two-factor.action.setup": {
|
||||
"message": "設定 2FA"
|
||||
},
|
||||
"settings.account.security.two-factor.description": {
|
||||
"message": "為你的帳號登入程序增加額外的安全防護。"
|
||||
},
|
||||
"settings.account.security.two-factor.title": {
|
||||
"message": "雙重驗證"
|
||||
},
|
||||
"settings.account.two-factor.backup.intro": {
|
||||
"message": "請下載這些備用碼並將其儲存在安全的地方。若你失去裝置的存取權,可以使用這些備用碼替代 2FA 驗證碼!請務必像保護密碼一樣妥善保管這些代碼。"
|
||||
},
|
||||
"settings.account.two-factor.backup.single-use": {
|
||||
"message": "備份碼只能使用一次。"
|
||||
},
|
||||
"settings.account.two-factor.error.incorrect-code": {
|
||||
"message": "輸入的驗證碼不正確!"
|
||||
},
|
||||
"settings.account.two-factor.field.code.description": {
|
||||
"message": "請輸入兩步驟驗證碼以繼續。"
|
||||
},
|
||||
"settings.account.two-factor.field.code.label": {
|
||||
"message": "輸入雙重驗證碼"
|
||||
},
|
||||
"settings.account.two-factor.field.code.placeholder": {
|
||||
"message": "輸入驗證碼..."
|
||||
},
|
||||
"settings.account.two-factor.setup.intro": {
|
||||
"message": "雙重驗證要求必須使用第二部裝置才能登入,藉此確保你的帳號安全性。"
|
||||
},
|
||||
"settings.account.two-factor.setup.manual-secret": {
|
||||
"message": "如果無法掃描 QR code,你可以手動輸入金鑰:"
|
||||
},
|
||||
"settings.account.two-factor.setup.scan": {
|
||||
"message": "請使用 <authy-link>Authy</authy-link>、<microsoft-authenticator-link>Microsoft Authenticator</microsoft-authenticator-link> 或任何其他兩步驟驗證 (2FA) 應用程式掃描 QR 碼以開始。"
|
||||
},
|
||||
"settings.account.two-factor.verify.description": {
|
||||
"message": "請輸入驗證程式中的一次性驗證碼以驗證存取權。"
|
||||
},
|
||||
"settings.account.two-factor.verify.label": {
|
||||
"message": "驗證碼"
|
||||
},
|
||||
"settings.applications.about": {
|
||||
"message": "關於"
|
||||
},
|
||||
@@ -3092,9 +3110,6 @@
|
||||
"settings.applications.field.url.placeholder": {
|
||||
"message": "https://example.com"
|
||||
},
|
||||
"settings.applications.head-title": {
|
||||
"message": "應用程式"
|
||||
},
|
||||
"settings.applications.modal.header": {
|
||||
"message": "應用程式資訊"
|
||||
},
|
||||
@@ -3107,93 +3122,12 @@
|
||||
"settings.applications.secret.disclaimer": {
|
||||
"message": "請立即儲存你的密碼,離開這個頁面後將不再顯示!"
|
||||
},
|
||||
"settings.authorizations.about-this-app": {
|
||||
"message": "關於這個應用程式"
|
||||
},
|
||||
"settings.authorizations.by": {
|
||||
"message": "作者"
|
||||
},
|
||||
"settings.authorizations.description": {
|
||||
"message": "當你使用 Modrinth 帳號授權應用程式時,即代表你授予該應用程式存取你帳戶的權限。你可以隨時在這裡管理並審查帳號的存取權。"
|
||||
},
|
||||
"settings.authorizations.empty-state": {
|
||||
"message": "目前無法顯示你已授權的應用程式,我們正在努力修正這個問題。請稍後再回來查看!"
|
||||
},
|
||||
"settings.authorizations.head-title": {
|
||||
"message": "授權"
|
||||
},
|
||||
"settings.authorizations.revoke.action": {
|
||||
"message": "撤銷"
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.description": {
|
||||
"message": "這將撤銷該應用程式存取你帳號的權限。你隨時可以於稍後重新授權。"
|
||||
},
|
||||
"settings.authorizations.revoke.confirm.title": {
|
||||
"message": "你確定要撤銷這個應用程式的授權嗎?"
|
||||
},
|
||||
"settings.billing.charges.description": {
|
||||
"message": "你對 Modrinth 帳號的所有過往支付紀錄皆會列於這裡:"
|
||||
},
|
||||
"settings.billing.charges.product.medal-trial": {
|
||||
"message": "Medal 伺服器試用方案"
|
||||
},
|
||||
"settings.billing.charges.product.midas": {
|
||||
"message": "Modrinth Plus"
|
||||
},
|
||||
"settings.billing.charges.product.pyro": {
|
||||
"message": "Modrinth Hosting"
|
||||
},
|
||||
"settings.billing.charges.title": {
|
||||
"message": "過往支付紀錄"
|
||||
},
|
||||
"settings.billing.expires": {
|
||||
"message": "到期日:{date}"
|
||||
},
|
||||
"settings.billing.interval.month": {
|
||||
"message": "月"
|
||||
},
|
||||
"settings.billing.interval.monthly": {
|
||||
"message": "每月"
|
||||
},
|
||||
"settings.billing.interval.year": {
|
||||
"message": "年"
|
||||
},
|
||||
"settings.billing.interval.yearly": {
|
||||
"message": "每年"
|
||||
},
|
||||
"settings.billing.midas.benefits.ad-free": {
|
||||
"message": "在 modrinth.com 與 Modrinth App 上享受無廣告的瀏覽體驗"
|
||||
},
|
||||
"settings.billing.midas.benefits.badge": {
|
||||
"message": "在你的個人檔案顯示 Modrinth+ 徽章"
|
||||
},
|
||||
"settings.billing.midas.benefits.support": {
|
||||
"message": "直接支持 Modrinth 與創作者"
|
||||
},
|
||||
"settings.billing.midas.benefits.title": {
|
||||
"message": "福利"
|
||||
},
|
||||
"settings.billing.midas.save-per-year": {
|
||||
"message": "改用年繳計費,每年現省 {amount}!"
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line1": {
|
||||
"message": "你已取消訂閱。"
|
||||
},
|
||||
"settings.billing.midas.status.cancelled.line2": {
|
||||
"message": "在目前計費週期結束前,你仍可繼續享有福利。"
|
||||
},
|
||||
"settings.billing.midas.status.failed": {
|
||||
"message": "你的訂閱支付方式失敗。請更新你的支付方式。"
|
||||
},
|
||||
"settings.billing.midas.status.open": {
|
||||
"message": "你目前訂閱的方案為:"
|
||||
},
|
||||
"settings.billing.midas.status.processing": {
|
||||
"message": "我們正在處理你的付款。一旦付款完成,系統將立即啟用你的福利。"
|
||||
},
|
||||
"settings.billing.midas.upsell": {
|
||||
"message": "立即訂閱 Modrinth Plus!"
|
||||
},
|
||||
"settings.billing.modal.cancel.action": {
|
||||
"message": "取消訂閱"
|
||||
},
|
||||
@@ -3212,12 +3146,6 @@
|
||||
"settings.billing.modal.delete.title": {
|
||||
"message": "你確定要移除這個付款方式嗎?"
|
||||
},
|
||||
"settings.billing.next": {
|
||||
"message": "下期:"
|
||||
},
|
||||
"settings.billing.or-yearly-save": {
|
||||
"message": "或以每年 {price} 訂閱(現省 {percent}%!)"
|
||||
},
|
||||
"settings.billing.payment_method.action.add": {
|
||||
"message": "新增付款方式"
|
||||
},
|
||||
@@ -3239,27 +3167,6 @@
|
||||
"settings.billing.payment_method.title": {
|
||||
"message": "付款方式"
|
||||
},
|
||||
"settings.billing.plan.title": {
|
||||
"message": "{size}方案"
|
||||
},
|
||||
"settings.billing.price.per-interval": {
|
||||
"message": "{price} / {interval}"
|
||||
},
|
||||
"settings.billing.price.slash-interval": {
|
||||
"message": "/{interval}"
|
||||
},
|
||||
"settings.billing.pyro.cpu": {
|
||||
"message": "{shared} 個共用 CPU(最高可爆發至 {bursts} 個 CPU)"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.not-found": {
|
||||
"message": "找不到與這個訂閱相關聯的伺服器。這可能有幾種原因:如果你才剛購買伺服器,這屬於正常現象,伺服器的佈署過程最多可能需要一小時。若你已購買一段時間,則伺服器可能已被停用。如果這與你的預期不符,請將以下資訊提供給 Modrinth 客服團隊:"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.server-id": {
|
||||
"message": "伺服器 ID:{id}"
|
||||
},
|
||||
"settings.billing.pyro.linked-server.stripe-id": {
|
||||
"message": "Stripe ID:{id}"
|
||||
},
|
||||
"settings.billing.pyro.ram": {
|
||||
"message": "{gb} GB 記憶體"
|
||||
},
|
||||
@@ -3269,66 +3176,21 @@
|
||||
"settings.billing.pyro.resubscribe.error.title": {
|
||||
"message": "重新訂閱時發生錯誤"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "已送出重新訂閱請求"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.success.text": {
|
||||
"message": "伺服器方案已重新訂閱成功"
|
||||
},
|
||||
"settings.billing.pyro.status.failed": {
|
||||
"message": "你的訂閱扣款失敗。請更新你的付款方式,然後重新訂閱。"
|
||||
},
|
||||
"settings.billing.pyro.status.processing": {
|
||||
"message": "你的付款正在處理中。完成付款後,系統將立即啟用你的伺服器。"
|
||||
},
|
||||
"settings.billing.pyro.storage": {
|
||||
"message": "{gb} GB SSD"
|
||||
},
|
||||
"settings.billing.pyro.swap": {
|
||||
"message": "{gb} GB 置換空間"
|
||||
},
|
||||
"settings.billing.pyro_subscription.description": {
|
||||
"message": "管理你的 Modrinth 伺服器訂閱。"
|
||||
},
|
||||
"settings.billing.pyro_subscription.title": {
|
||||
"message": "Modrinth 伺服器訂閱"
|
||||
},
|
||||
"settings.billing.renews": {
|
||||
"message": "將於{date}續訂"
|
||||
},
|
||||
"settings.billing.resubscribe": {
|
||||
"message": "重新訂閱"
|
||||
},
|
||||
"settings.billing.since": {
|
||||
"message": "自{date}起"
|
||||
},
|
||||
"settings.billing.subscribe": {
|
||||
"message": "訂閱"
|
||||
},
|
||||
"settings.billing.subscription.description": {
|
||||
"message": "管理你的 Modrinth 訂閱。"
|
||||
},
|
||||
"settings.billing.subscription.title": {
|
||||
"message": "訂閱"
|
||||
},
|
||||
"settings.billing.switch.switching-to-interval": {
|
||||
"message": "正在切換至{interval}計費"
|
||||
},
|
||||
"settings.billing.switch.to-interval": {
|
||||
"message": "切換至{interval}計費"
|
||||
},
|
||||
"settings.billing.switch.tooltip.monthly-additional-per-year": {
|
||||
"message": "每月帳單將額外收取 {amount}/年"
|
||||
},
|
||||
"settings.billing.switches-to-billing-on": {
|
||||
"message": "於 {date} 轉換為 {interval} 付款週期"
|
||||
},
|
||||
"settings.billing.update-method": {
|
||||
"message": "更新方式"
|
||||
},
|
||||
"settings.billing.upgrade": {
|
||||
"message": "升級"
|
||||
},
|
||||
"settings.display.banner.developer-mode.button": {
|
||||
"message": "停用開發人員模式"
|
||||
},
|
||||
@@ -3341,12 +3203,6 @@
|
||||
"settings.display.flags.title": {
|
||||
"message": "功能開關"
|
||||
},
|
||||
"settings.display.notification.developer-mode-deactivated.text": {
|
||||
"message": "開發者模式已被停用"
|
||||
},
|
||||
"settings.display.notification.developer-mode-deactivated.title": {
|
||||
"message": "開發者模式已停用"
|
||||
},
|
||||
"settings.display.project-list-layouts.datapack": {
|
||||
"message": "資料包頁面"
|
||||
},
|
||||
@@ -3359,12 +3215,6 @@
|
||||
"settings.display.project-list-layouts.mode.gallery": {
|
||||
"message": "圖庫"
|
||||
},
|
||||
"settings.display.project-list-layouts.mode.grid": {
|
||||
"message": "網格"
|
||||
},
|
||||
"settings.display.project-list-layouts.mode.rows": {
|
||||
"message": "列"
|
||||
},
|
||||
"settings.display.project-list-layouts.modpack": {
|
||||
"message": "模組包頁面"
|
||||
},
|
||||
@@ -3425,9 +3275,6 @@
|
||||
"settings.display.theme.title": {
|
||||
"message": "色彩主題"
|
||||
},
|
||||
"settings.head-title": {
|
||||
"message": "顯示設定"
|
||||
},
|
||||
"settings.pats.action.create": {
|
||||
"message": "建立個人存取權杖"
|
||||
},
|
||||
@@ -3488,9 +3335,6 @@
|
||||
"settings.profile.description": {
|
||||
"message": "你的個人檔案資訊會公開顯示在 Modrinth 上,並可透過 <docs-link>Modrinth API</docs-link> 查詢。"
|
||||
},
|
||||
"settings.profile.head-title": {
|
||||
"message": "個人設定"
|
||||
},
|
||||
"settings.profile.profile-info": {
|
||||
"message": "個人檔案資訊"
|
||||
},
|
||||
@@ -3527,9 +3371,6 @@
|
||||
"settings.sidebar.label.developer": {
|
||||
"message": "開發人員"
|
||||
},
|
||||
"settings.sidebar.label.display": {
|
||||
"message": "顯示"
|
||||
},
|
||||
"ui.latest-news-row.latest-news": {
|
||||
"message": "Modrinth 的最新消息"
|
||||
},
|
||||
|
||||
@@ -32,11 +32,10 @@ export default defineNuxtRouteMiddleware(async (to) => {
|
||||
const projectId = to.params.id as string
|
||||
|
||||
try {
|
||||
// Fetch v2 and v3 in parallel — cache both for the page's useQuery calls
|
||||
const [project, projectV3] = await Promise.all([
|
||||
queryClient.fetchQuery(projectQueryOptions.v2(projectId, client)),
|
||||
queryClient.fetchQuery(projectQueryOptions.v3(projectId, client)),
|
||||
])
|
||||
// Fetch v2 project for redirect check AND cache it for the page
|
||||
// Using fetchQuery ensures the page's useQuery gets this cached result
|
||||
const project = await queryClient.fetchQuery(projectQueryOptions.v2(projectId, client))
|
||||
const projectV3 = await queryClient.fetchQuery(projectQueryOptions.v3(projectId, client))
|
||||
|
||||
// Let page handle 404
|
||||
if (!project) return
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
<nuxt-link
|
||||
:to="`/${projectV2.project_type}/${
|
||||
projectV2.slug ? projectV2.slug : projectV2.id
|
||||
}/version/${encodeURI(version.displayUrlEnding ? version.displayUrlEnding : version.id)}`"
|
||||
}/version/${encodeURI(version.displayUrlEnding)}`"
|
||||
>
|
||||
{{ version.name }}
|
||||
</nuxt-link>
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
(version: any) =>
|
||||
`/${project.project_type}/${
|
||||
project.slug ? project.slug : project.id
|
||||
}/version/${encodeURI(version.displayUrlEnding ? version.displayUrlEnding : version.id)}`
|
||||
}/version/${encodeURI(version.displayUrlEnding)}`
|
||||
"
|
||||
:open-modal="currentMember ? () => handleOpenCreateVersionModal() : undefined"
|
||||
>
|
||||
@@ -89,7 +89,7 @@
|
||||
action: () => {},
|
||||
link: `/${project.project_type}/${
|
||||
project.slug ? project.slug : project.id
|
||||
}/version/${encodeURI(version.displayUrlEnding ? version.displayUrlEnding : version.id)}`,
|
||||
}/version/${encodeURI(version.displayUrlEnding)}`,
|
||||
external: true,
|
||||
},
|
||||
{
|
||||
@@ -98,7 +98,7 @@
|
||||
copyToClipboard(
|
||||
`https://modrinth.com/${project.project_type}/${
|
||||
project.slug ? project.slug : project.id
|
||||
}/version/${encodeURI(version.displayUrlEnding ? version.displayUrlEnding : version.id)}`,
|
||||
}/version/${encodeURI(version.displayUrlEnding)}`,
|
||||
),
|
||||
},
|
||||
{
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
class="action"
|
||||
:to="`/${project.project_type}/${
|
||||
project.slug ? project.slug : project.id
|
||||
}/version/${encodeURI(version.displayUrlEnding ? version.displayUrlEnding : version.id)}`"
|
||||
}/version/${encodeURI(version.displayUrlEnding)}`"
|
||||
>
|
||||
<XIcon aria-hidden="true" />
|
||||
Discard changes
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
action: () => {},
|
||||
link: `/${project.project_type}/${
|
||||
project.slug ? project.slug : project.id
|
||||
}/version/${encodeURI(version.displayUrlEnding ? version.displayUrlEnding : version.id)}`,
|
||||
}/version/${encodeURI(version.displayUrlEnding)}`,
|
||||
external: true,
|
||||
},
|
||||
{
|
||||
@@ -119,7 +119,7 @@
|
||||
copyToClipboard(
|
||||
`https://modrinth.com/${project.project_type}/${
|
||||
project.slug ? project.slug : project.id
|
||||
}/version/${encodeURI(version.displayUrlEnding ? version.displayUrlEnding : version.id)}`,
|
||||
}/version/${encodeURI(version.displayUrlEnding)}`,
|
||||
),
|
||||
},
|
||||
{
|
||||
|
||||
@@ -37,8 +37,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { injectModrinthClient, ServersManageRootLayout } from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
import { ServersManageRootLayout } from '@modrinth/ui'
|
||||
|
||||
import { reloadNuxtApp } from '#app'
|
||||
import { products } from '~/generated/state.json'
|
||||
@@ -49,21 +48,6 @@ const router = useRouter()
|
||||
const config = useRuntimeConfig()
|
||||
const serverId = route.params.id as string
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
if (serverId) {
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['servers', 'detail', serverId],
|
||||
queryFn: () => client.archon.servers_v0.get(serverId)!,
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
}
|
||||
|
||||
const auth = (await useAuth()) as unknown as {
|
||||
value: { user: { id: string; username: string; email: string; created: string } }
|
||||
}
|
||||
|
||||
@@ -1,28 +1,9 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
injectModrinthClient,
|
||||
injectModrinthServerContext,
|
||||
ServersManageBackupsPage,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
import { injectModrinthServerContext, ServersManageBackupsPage } from '@modrinth/ui'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { server, serverId, worldId, isServerRunning } = injectModrinthServerContext()
|
||||
const queryClient = useQueryClient()
|
||||
const { server, isServerRunning } = injectModrinthServerContext()
|
||||
const flags = useFeatureFlags()
|
||||
|
||||
if (worldId.value) {
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['backups', 'list', serverId],
|
||||
queryFn: () => client.archon.backups_v1.list(serverId, worldId.value!),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
}
|
||||
|
||||
useHead({
|
||||
title: `Backups - ${server.value?.name ?? 'Server'} - Modrinth`,
|
||||
})
|
||||
|
||||
@@ -1,27 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
injectModrinthClient,
|
||||
injectModrinthServerContext,
|
||||
ServersManageContentPage,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
import { injectModrinthServerContext, ServersManageContentPage } from '@modrinth/ui'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { server, serverId, worldId } = injectModrinthServerContext()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
if (worldId.value) {
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['content', 'list', 'v1', serverId],
|
||||
queryFn: () =>
|
||||
client.archon.content_v1.getAddons(serverId, worldId.value!, { from_modpack: false }),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
}
|
||||
const { server } = injectModrinthServerContext()
|
||||
|
||||
useHead({
|
||||
title: `Content - ${server.value?.name ?? 'Server'} - Modrinth`,
|
||||
|
||||
@@ -1,26 +1,9 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
injectModrinthClient,
|
||||
injectModrinthServerContext,
|
||||
ServersManageFilesPage,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
import { injectModrinthServerContext, ServersManageFilesPage } from '@modrinth/ui'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { server, serverId } = injectModrinthServerContext()
|
||||
const queryClient = useQueryClient()
|
||||
const { server } = injectModrinthServerContext()
|
||||
const flags = useFeatureFlags()
|
||||
|
||||
try {
|
||||
await queryClient.ensureQueryData({
|
||||
queryKey: ['files', serverId, '/'],
|
||||
queryFn: () => client.kyros.files_v0.listDirectory('/', 1, 2000),
|
||||
staleTime: 30_000,
|
||||
})
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
|
||||
useHead({
|
||||
title: computed(() => `Files - ${server.value?.name ?? 'Server'} - Modrinth`),
|
||||
})
|
||||
|
||||
@@ -8,16 +8,7 @@ export default defineNuxtPlugin((nuxt) => {
|
||||
const vueQueryState = useState<DehydratedState | null>('vue-query')
|
||||
|
||||
const queryClient = new QueryClient({
|
||||
defaultOptions: {
|
||||
queries: {
|
||||
staleTime: 10000,
|
||||
retry: (failureCount, error) => {
|
||||
const status = (error as any)?.statusCode ?? (error as any)?.status
|
||||
if (status !== undefined && status >= 400 && status < 500 && status !== 429) return false
|
||||
return failureCount < 3
|
||||
},
|
||||
},
|
||||
},
|
||||
defaultOptions: { queries: { staleTime: 10000 } },
|
||||
})
|
||||
const options: VueQueryPluginOptions = { queryClient }
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import { provideNotificationManager } from '@modrinth/ui'
|
||||
import { FrontendNotificationManager } from './frontend-notifications'
|
||||
import { setupAuthProvider } from './setup/auth'
|
||||
import { setupFilePickerProvider } from './setup/file-picker'
|
||||
import { setupLoadingStateProvider } from './setup/loading-state'
|
||||
import { setupModrinthClientProvider } from './setup/modrinth-client'
|
||||
import { setupPageContextProvider } from './setup/page-context'
|
||||
import { setupTagsProvider } from './setup/tags'
|
||||
@@ -16,5 +15,4 @@ export function setupProviders(auth: Awaited<ReturnType<typeof useAuth>>) {
|
||||
setupTagsProvider()
|
||||
setupFilePickerProvider()
|
||||
setupPageContextProvider()
|
||||
setupLoadingStateProvider()
|
||||
}
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
import type { LoadingStateProvider } from '@modrinth/ui'
|
||||
import { createLoadingStateCore, provideLoadingState } from '@modrinth/ui'
|
||||
import { watch } from 'vue'
|
||||
|
||||
/**
|
||||
* Initialize the cross-platform loading-state provider for the website.
|
||||
*
|
||||
* Responsibilities:
|
||||
* 1. Own the token-based ref-counter that drives `LoadingBar` and `ReadyTransition`.
|
||||
* 2. Bridge the legacy `useState('loading')` global so the many existing
|
||||
* `startLoading()` / `stopLoading()` call sites continue to raise the bar.
|
||||
* 3. Register Nuxt `page:start` / `page:finish` hooks so route navigation
|
||||
* auto-fires the bar (replaces the behavior previously inside
|
||||
* `modrinth-loading-indicator.ts`).
|
||||
*/
|
||||
export function setupLoadingStateProvider(): LoadingStateProvider {
|
||||
const provider = createLoadingStateCore({ barEnabled: true })
|
||||
provideLoadingState(provider)
|
||||
|
||||
const legacyState = useLoading()
|
||||
let legacyToken: symbol | null = null
|
||||
watch(
|
||||
legacyState,
|
||||
(value) => {
|
||||
if (value && !legacyToken) {
|
||||
legacyToken = provider.begin()
|
||||
} else if (!value && legacyToken) {
|
||||
provider.end(legacyToken)
|
||||
legacyToken = null
|
||||
}
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
const nuxtApp = useNuxtApp()
|
||||
let pageToken: symbol | null = null
|
||||
nuxtApp.hook('page:start', () => {
|
||||
if (pageToken) provider.end(pageToken)
|
||||
pageToken = provider.begin()
|
||||
})
|
||||
nuxtApp.hook('page:finish', () => {
|
||||
if (pageToken) {
|
||||
provider.end(pageToken)
|
||||
pageToken = null
|
||||
}
|
||||
})
|
||||
|
||||
return provider
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import type { ManageVersionContextValue } from '../manage-version-modal'
|
||||
export const stageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
id: 'add-files',
|
||||
stageContent: markRaw(AddFilesStage),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit version' : 'Files'),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit files' : 'Files'),
|
||||
nonProgressStage: (ctx) => ctx.editingVersion.value,
|
||||
cannotNavigateForward: (ctx) => {
|
||||
const hasFiles =
|
||||
@@ -64,7 +64,7 @@ export const stageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
export const fromDetailsStageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
id: 'from-details-files',
|
||||
stageContent: markRaw(AddFilesStage),
|
||||
title: 'Edit version',
|
||||
title: 'Edit files',
|
||||
nonProgressStage: true,
|
||||
leftButtonConfig: (ctx) => {
|
||||
const hasFiles =
|
||||
|
||||
@@ -9,7 +9,7 @@ import type { ManageVersionContextValue } from '../manage-version-modal'
|
||||
export const stageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
id: 'add-dependencies',
|
||||
stageContent: markRaw(DependenciesStage),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit version' : 'Dependencies'),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit dependencies' : 'Dependencies'),
|
||||
skip: (ctx) => ctx.suggestedDependencies.value != null || ctx.projectType.value === 'modpack',
|
||||
leftButtonConfig: (ctx) =>
|
||||
ctx.editingVersion.value
|
||||
@@ -38,7 +38,7 @@ export const stageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
export const fromDetailsStageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
id: 'from-details-dependencies',
|
||||
stageContent: markRaw(DependenciesStage),
|
||||
title: 'Edit version',
|
||||
title: 'Edit dependencies',
|
||||
nonProgressStage: true,
|
||||
leftButtonConfig: (ctx) => ({
|
||||
label: 'Back',
|
||||
|
||||
@@ -9,7 +9,7 @@ import type { ManageVersionContextValue } from '../manage-version-modal'
|
||||
export const stageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
id: 'add-details',
|
||||
stageContent: markRaw(DetailsStage),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit version' : 'Details'),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit details' : 'Details'),
|
||||
maxWidth: '744px',
|
||||
disableClose: (ctx) => ctx.isUploading.value,
|
||||
leftButtonConfig: (ctx) =>
|
||||
|
||||
@@ -9,7 +9,7 @@ import type { ManageVersionContextValue } from '../manage-version-modal'
|
||||
export const stageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
id: 'add-environment',
|
||||
stageContent: markRaw(EnvironmentStage),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit version' : 'Environment'),
|
||||
title: (ctx) => (ctx.editingVersion.value ? 'Edit environment' : 'Environment'),
|
||||
skip: (ctx) =>
|
||||
ctx.noEnvironmentProject.value ||
|
||||
(!ctx.editingVersion.value && !!ctx.inferredVersionData.value?.environment) ||
|
||||
@@ -33,7 +33,7 @@ export const stageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
export const fromDetailsStageConfig: StageConfigInput<ManageVersionContextValue> = {
|
||||
id: 'from-details-environment',
|
||||
stageContent: markRaw(EnvironmentStage),
|
||||
title: 'Edit version',
|
||||
title: 'Edit environment',
|
||||
nonProgressStage: true,
|
||||
leftButtonConfig: (ctx) => ({
|
||||
label: 'Back',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user