mirror of
https://github.com/modrinth/code.git
synced 2026-08-03 14:45:55 +00:00
Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
35f614f698 | ||
|
|
b9f05bcebb |
@@ -57,11 +57,8 @@ jobs:
|
||||
|
||||
- name: Extract app changelog
|
||||
env:
|
||||
GH_TOKEN: ${{ github.token }}
|
||||
VERSION: ${{ env.VERSION_TAG }}
|
||||
run: |
|
||||
LAST_GITHUB_RELEASE_PUBLISHED_AT=$(gh api "repos/${{ github.repository }}/releases/latest" --jq '.published_at // ""' 2>/dev/null || true)
|
||||
LAST_GITHUB_RELEASE_PUBLISHED_AT="$LAST_GITHUB_RELEASE_PUBLISHED_AT" npx --yes tsx scripts/build-theseus-release-notes.ts
|
||||
run: npx --yes tsx scripts/build-theseus-release-notes.ts
|
||||
|
||||
- name: Generate version manifest
|
||||
run: |
|
||||
|
||||
Vendored
+1
-1
@@ -9,7 +9,7 @@
|
||||
"files.insertFinalNewline": true,
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": "explicit",
|
||||
"source.organizeImports": "never"
|
||||
"source.organizeImports": "always"
|
||||
},
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"[vue]": {
|
||||
|
||||
@@ -64,7 +64,7 @@ The website and app `prepr` commands
|
||||
|
||||
Each project may have its own `CLAUDE.md` with detailed instructions:
|
||||
|
||||
- [`apps/labrinth/AGENTS.md`](apps/labrinth/AGENTS.md) — Backend API
|
||||
- [`apps/labrinth/CLAUDE.md`](apps/labrinth/CLAUDE.md) — Backend API
|
||||
- [`apps/frontend/CLAUDE.md`](apps/frontend/CLAUDE.md) - Frontend Website
|
||||
|
||||
## Code Guidelines
|
||||
|
||||
Generated
-1
@@ -10514,7 +10514,6 @@ dependencies = [
|
||||
"flate2",
|
||||
"fs4",
|
||||
"futures",
|
||||
"futures-lite 2.6.1",
|
||||
"heck 0.5.0",
|
||||
"hickory-resolver 0.25.2",
|
||||
"indicatif",
|
||||
|
||||
@@ -85,7 +85,6 @@ eyre = "0.6.12"
|
||||
flate2 = "1.1.4"
|
||||
fs4 = { version = "0.13.1", default-features = false }
|
||||
futures = "0.3.31"
|
||||
futures-lite = "2.6.1"
|
||||
futures-util = "0.3.31"
|
||||
heck = "0.5.0"
|
||||
hex = "0.4.3"
|
||||
|
||||
@@ -84,7 +84,6 @@ import InstallToPlayModal from '@/components/ui/modal/InstallToPlayModal.vue'
|
||||
import ModpackAlreadyInstalledModal from '@/components/ui/modal/ModpackAlreadyInstalledModal.vue'
|
||||
import UpdateToPlayModal from '@/components/ui/modal/UpdateToPlayModal.vue'
|
||||
import NavButton from '@/components/ui/NavButton.vue'
|
||||
import PrideFundraiserBanner from '@/components/ui/PrideFundraiserBanner.vue'
|
||||
import PromotionWrapper from '@/components/ui/PromotionWrapper.vue'
|
||||
import QuickInstanceSwitcher from '@/components/ui/QuickInstanceSwitcher.vue'
|
||||
import SplashScreen from '@/components/ui/SplashScreen.vue'
|
||||
@@ -95,14 +94,13 @@ import { hide_ads_window, init_ads_window, show_ads_window } from '@/helpers/ads
|
||||
import { debugAnalytics, initAnalytics, trackEvent } from '@/helpers/analytics'
|
||||
import { check_reachable } from '@/helpers/auth.js'
|
||||
import { get_user, get_version } from '@/helpers/cache.js'
|
||||
import { command_listener, notification_listener, warning_listener } from '@/helpers/events.js'
|
||||
import { command_listener, warning_listener } from '@/helpers/events.js'
|
||||
import { cancelLogin, get as getCreds, login, logout } from '@/helpers/mr_auth.ts'
|
||||
import { create_profile_and_install_from_file } from '@/helpers/pack'
|
||||
import { list } from '@/helpers/profile.js'
|
||||
import { mergeUrlQuery, parseModrinthLink } from '@/helpers/project-links.ts'
|
||||
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
|
||||
import { get_opening_command, initialize_state } from '@/helpers/state'
|
||||
import { hasActivePride26Midas, hasMidasBadge } from '@/helpers/user-campaigns.ts'
|
||||
import {
|
||||
areUpdatesEnabled,
|
||||
enqueueUpdateForInstallation,
|
||||
@@ -136,7 +134,6 @@ const route = useRoute()
|
||||
const APP_LEFT_NAV_WIDTH = '4rem'
|
||||
const APP_SIDEBAR_WIDTH = 300
|
||||
const INTERCOM_BUBBLE_DEFAULT_PADDING = 20
|
||||
const PRIDE_FUNDRAISER_END_DATE = new Date('2026-07-01T00:00:00Z').getTime()
|
||||
const credentials = ref()
|
||||
const sidebarToggled = ref(true)
|
||||
const unsubscribeSidebarToggle = themeStore.$subscribe(() => {
|
||||
@@ -147,9 +144,6 @@ const forceSidebar = computed(
|
||||
)
|
||||
const sidebarVisible = computed(() => sidebarToggled.value || forceSidebar.value)
|
||||
const hostingRouteActive = computed(() => route.path.startsWith('/hosting'))
|
||||
const prideFundraiserEnabled = computed(
|
||||
() => themeStore.getFeatureFlag('pride_fundraiser') && Date.now() < PRIDE_FUNDRAISER_END_DATE,
|
||||
)
|
||||
const hostingIntercomIdentityKey = computed(() => {
|
||||
const rawServerId = route.params.id
|
||||
const serverId = Array.isArray(rawServerId) ? rawServerId[0] : rawServerId
|
||||
@@ -198,12 +192,6 @@ const tauriApiClient = new TauriModrinthClient({
|
||||
],
|
||||
})
|
||||
provideModrinthClient(tauriApiClient)
|
||||
const { data: authenticatedModrinthUser } = useQuery({
|
||||
queryKey: computed(() => ['authenticated-user', 'campaigns', credentials.value?.user?.id]),
|
||||
queryFn: () => tauriApiClient.labrinth.users_v3.getAuthenticated(),
|
||||
enabled: () => !!credentials.value?.session,
|
||||
retry: false,
|
||||
})
|
||||
providePageContext({
|
||||
hierarchicalSidebarAvailable: ref(true),
|
||||
showAds: ref(false),
|
||||
@@ -241,7 +229,6 @@ const {
|
||||
|
||||
const news = ref([])
|
||||
const availableSurvey = ref(false)
|
||||
const displayedServerInviteNotifications = new Set()
|
||||
|
||||
const offline = ref(!navigator.onLine)
|
||||
window.addEventListener('offline', () => {
|
||||
@@ -689,11 +676,12 @@ async function logOut() {
|
||||
await fetchCredentials()
|
||||
}
|
||||
|
||||
const MIDAS_BITFLAG = 1 << 0
|
||||
const hasPlus = computed(
|
||||
() =>
|
||||
!!credentials.value?.user &&
|
||||
(hasMidasBadge(credentials.value.user) ||
|
||||
hasActivePride26Midas(authenticatedModrinthUser.value?.campaigns?.pride_26)),
|
||||
credentials.value &&
|
||||
credentials.value.user &&
|
||||
(credentials.value.user.badges & MIDAS_BITFLAG) === MIDAS_BITFLAG,
|
||||
)
|
||||
|
||||
const showAd = computed(
|
||||
@@ -753,86 +741,6 @@ const accounts = ref(null)
|
||||
provide('accountsCard', accounts)
|
||||
|
||||
command_listener(handleCommand)
|
||||
notification_listener(handleLiveNotification)
|
||||
|
||||
async function markLiveNotificationRead(notification) {
|
||||
try {
|
||||
await tauriApiClient.labrinth.notifications_v2.markAsRead(notification.id)
|
||||
} catch (error) {
|
||||
if (error instanceof ModrinthApiError && error.statusCode === 404) {
|
||||
console.warn(`notification ${notification.id} could not be marked as read`, error)
|
||||
return
|
||||
}
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
async function respondToServerInvite(notification, action) {
|
||||
const serverId = notification.body?.server_id
|
||||
if (typeof serverId !== 'string') {
|
||||
throw new Error('Missing server ID for invite notification.')
|
||||
}
|
||||
|
||||
await tauriApiClient.request(`/servers/${serverId}/invites/${action}`, {
|
||||
api: 'archon',
|
||||
version: 1,
|
||||
method: 'POST',
|
||||
})
|
||||
await markLiveNotificationRead(notification)
|
||||
|
||||
return serverId
|
||||
}
|
||||
|
||||
async function acceptServerInviteNotification(notification) {
|
||||
try {
|
||||
const serverId = await respondToServerInvite(notification, 'accept')
|
||||
await router.push(`/hosting/manage/${encodeURIComponent(serverId)}`)
|
||||
queryClient.invalidateQueries({ queryKey: ['servers'] })
|
||||
} catch (error) {
|
||||
handleError(error)
|
||||
}
|
||||
}
|
||||
|
||||
async function declineServerInviteNotification(notification) {
|
||||
try {
|
||||
await respondToServerInvite(notification, 'decline')
|
||||
} catch (error) {
|
||||
handleError(error)
|
||||
}
|
||||
}
|
||||
|
||||
function openServerInviteInviterProfile(inviterName) {
|
||||
if (!inviterName) return
|
||||
openUrl(`${config.siteUrl}/user/${encodeURIComponent(inviterName)}`)
|
||||
}
|
||||
|
||||
async function handleLiveNotification(notification) {
|
||||
if (notification?.body?.type !== 'server_invite' || notification.read) return
|
||||
if (displayedServerInviteNotifications.has(notification.id)) return
|
||||
|
||||
displayedServerInviteNotifications.add(notification.id)
|
||||
|
||||
const serverName =
|
||||
typeof notification.body.server_name === 'string' ? notification.body.server_name : 'a server'
|
||||
const inviterId = notification.body.invited_by
|
||||
const invitedBy =
|
||||
typeof inviterId === 'string' ? await get_user(inviterId, 'bypass').catch(() => null) : null
|
||||
|
||||
addPopupNotification({
|
||||
title: serverName,
|
||||
autoCloseMs: null,
|
||||
toast: {
|
||||
type: 'server-invite',
|
||||
actorName: invitedBy?.username ?? null,
|
||||
actorAvatarUrl: invitedBy?.avatar_url ?? null,
|
||||
entityName: serverName,
|
||||
onAccept: () => acceptServerInviteNotification(notification),
|
||||
onDecline: () => declineServerInviteNotification(notification),
|
||||
onOpenActor: () => openServerInviteInviterProfile(invitedBy?.username ?? null),
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
async function handleCommand(e) {
|
||||
if (!e) return
|
||||
|
||||
@@ -1571,10 +1479,6 @@ provideAppUpdateDownloadProgress(appUpdateDownload)
|
||||
<FriendsList :credentials="credentials" :sign-in="() => signIn()" />
|
||||
</suspense>
|
||||
</div>
|
||||
<PrideFundraiserBanner
|
||||
v-if="prideFundraiserEnabled"
|
||||
class="p-4 border-0 border-b-[1px] border-[--brand-gradient-border] border-solid"
|
||||
/>
|
||||
<div v-if="news && news.length > 0" class="p-4 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">
|
||||
|
||||
@@ -133,7 +133,6 @@ import {
|
||||
type PopupNotificationProgressItem,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { convertFileSrc } from '@tauri-apps/api/core'
|
||||
import { Dropdown } from 'floating-vue'
|
||||
import { computed, onBeforeUnmount, onMounted, ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
@@ -285,7 +284,6 @@ function goToTerminal(path?: string) {
|
||||
}
|
||||
|
||||
const currentLoadingBars = ref<LoadingBar[]>([])
|
||||
const currentLoadingBarIconUrls = ref<Record<string, string | null>>({})
|
||||
const notificationId = ref<string | number | null>(null)
|
||||
const dismissed = ref(false)
|
||||
|
||||
@@ -305,16 +303,6 @@ function getLoadingText(loadingBar: LoadingBar): string {
|
||||
return loadingBar.message ? `${percent}% ${loadingBar.message}` : `${percent}%`
|
||||
}
|
||||
|
||||
function getDisplayIconUrl(icon: string | null | undefined): string | null {
|
||||
if (!icon) {
|
||||
return null
|
||||
}
|
||||
if (/^(https?:|data:|blob:|asset:|tauri:)/.test(icon)) {
|
||||
return icon
|
||||
}
|
||||
return convertFileSrc(icon)
|
||||
}
|
||||
|
||||
function getNotification(): PopupNotification | null {
|
||||
if (!notificationId.value) {
|
||||
return null
|
||||
@@ -338,7 +326,6 @@ function buildDownloadItems(): PopupNotificationProgressItem[] {
|
||||
id: getLoadingBarKey(bar),
|
||||
title: bar.title ?? '',
|
||||
text: getLoadingText(bar),
|
||||
iconUrl: currentLoadingBarIconUrls.value[getLoadingBarKey(bar)] ?? null,
|
||||
progress: getLoadingProgress(bar),
|
||||
waiting: !bar.total || bar.total <= 0,
|
||||
}))
|
||||
@@ -413,32 +400,6 @@ async function refreshLoadingBars() {
|
||||
.map(formatLoadingBars)
|
||||
.filter((bar) => bar?.bar_type?.type !== 'launcher_update')
|
||||
|
||||
const profilePaths = Array.from(
|
||||
new Set(
|
||||
currentLoadingBars.value
|
||||
.map((bar) => bar.bar_type?.profile_path)
|
||||
.filter((path): path is string => !!path),
|
||||
),
|
||||
)
|
||||
const profiles = profilePaths.length
|
||||
? await getInstances(profilePaths).catch((error) => {
|
||||
handleError(error)
|
||||
return []
|
||||
})
|
||||
: []
|
||||
const profileIconUrls = new Map(
|
||||
profiles.map((profile) => [profile.path, getDisplayIconUrl(profile.icon_path)]),
|
||||
)
|
||||
currentLoadingBarIconUrls.value = Object.fromEntries(
|
||||
currentLoadingBars.value.map((bar) => {
|
||||
const barIconUrl = getDisplayIconUrl(bar.bar_type?.icon)
|
||||
const profileIconUrl = bar.bar_type?.profile_path
|
||||
? profileIconUrls.get(bar.bar_type.profile_path)
|
||||
: null
|
||||
return [getLoadingBarKey(bar), barIconUrl ?? profileIconUrl ?? null]
|
||||
}),
|
||||
)
|
||||
|
||||
currentLoadingBars.value.sort((a, b) => {
|
||||
const aKey = `${a.loading_bar_uuid ?? a.id ?? ''}`
|
||||
const bKey = `${b.loading_bar_uuid ?? b.id ?? ''}`
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { CalendarIcon, UsersIcon, XIcon } from '@modrinth/assets'
|
||||
import { injectModrinthClient, ProgressBar } from '@modrinth/ui'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import { openUrl } from '@tauri-apps/plugin-opener'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
const DISMISSED_STORAGE_KEY = 'pride-fundraiser-2026-dismissed'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const dismissed = ref(localStorage.getItem(DISMISSED_STORAGE_KEY) === 'true')
|
||||
|
||||
const { data: campaignInfo } = useQuery({
|
||||
queryKey: ['campaign', 'pride-26'],
|
||||
queryFn: () => client.labrinth.campaign_internal.getPride26(),
|
||||
enabled: () => !dismissed.value,
|
||||
staleTime: 15 * 60 * 1000,
|
||||
refetchInterval: 15 * 60 * 1000,
|
||||
retry: false,
|
||||
})
|
||||
const shouldShowBanner = computed(
|
||||
() => !dismissed.value && Number(campaignInfo.value?.target_usd) > 0,
|
||||
)
|
||||
|
||||
async function openPrideFundraiser() {
|
||||
await openUrl('https://modrinth.com/pride?from=app')
|
||||
}
|
||||
|
||||
function dismissBanner() {
|
||||
dismissed.value = true
|
||||
localStorage.setItem(DISMISSED_STORAGE_KEY, 'true')
|
||||
}
|
||||
|
||||
function formatUsd(amount: string | number) {
|
||||
return Number(amount).toLocaleString('en-US', {
|
||||
style: 'currency',
|
||||
currency: 'USD',
|
||||
maximumFractionDigits: 0,
|
||||
})
|
||||
}
|
||||
|
||||
function daysLeft() {
|
||||
return Math.max(
|
||||
0,
|
||||
Math.ceil((new Date('2026-07-01T00:00:00Z').getTime() - Date.now()) / (24 * 60 * 60 * 1000)),
|
||||
)
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-if="shouldShowBanner && campaignInfo">
|
||||
<section
|
||||
role="link"
|
||||
tabindex="0"
|
||||
class="flex w-full cursor-pointer flex-col gap-3 rounded-xl border border-solid border-surface-5 bg-button-bg p-3 text-primary transition-[border-color,filter] hover:border-surface-6 hover:brightness-125 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-brand"
|
||||
aria-label="Open Pride fundraiser"
|
||||
@click="openPrideFundraiser"
|
||||
@keydown.enter="openPrideFundraiser"
|
||||
@keydown.space.prevent="openPrideFundraiser"
|
||||
>
|
||||
<div class="flex w-full items-center justify-between gap-2">
|
||||
<h2 class="m-0 min-w-0 truncate text-base font-semibold text-contrast">
|
||||
Pride Fundraiser 2026
|
||||
</h2>
|
||||
<button
|
||||
type="button"
|
||||
class="m-0 flex size-5 shrink-0 cursor-pointer items-center justify-center border-0 bg-transparent p-0 text-primary transition-colors hover:text-contrast focus-visible:text-contrast"
|
||||
aria-label="Dismiss Pride fundraiser"
|
||||
@click.stop="dismissBanner"
|
||||
@keydown.stop
|
||||
>
|
||||
<XIcon aria-hidden="true" class="size-5" />
|
||||
</button>
|
||||
</div>
|
||||
<div class="h-px w-full bg-surface-5" />
|
||||
<div class="flex w-full flex-col gap-2.5">
|
||||
<div class="flex items-end gap-1 whitespace-nowrap">
|
||||
<span class="text-base font-semibold leading-5 text-contrast">
|
||||
{{ formatUsd(campaignInfo.total_donations_usd) }}
|
||||
</span>
|
||||
<span class="text-xs font-medium leading-4">
|
||||
of {{ formatUsd(campaignInfo.target_usd) }}
|
||||
</span>
|
||||
</div>
|
||||
<ProgressBar
|
||||
class="pride-fundraiser-banner__progress"
|
||||
:progress="Number(campaignInfo.total_donations_usd)"
|
||||
:max="Number(campaignInfo.target_usd)"
|
||||
color="purple"
|
||||
full-width
|
||||
:gradient-border="false"
|
||||
:aria-label="`${formatUsd(campaignInfo.total_donations_usd)} of ${formatUsd(
|
||||
campaignInfo.target_usd,
|
||||
)} raised`"
|
||||
/>
|
||||
<div class="flex flex-wrap items-center gap-2 text-xs font-medium leading-4">
|
||||
<span class="flex items-center gap-1">
|
||||
<UsersIcon aria-hidden="true" class="size-4 shrink-0" />
|
||||
{{ campaignInfo.num_donators.toLocaleString('en-US') }}
|
||||
{{ campaignInfo.num_donators === 1 ? 'supporter' : 'supporters' }}
|
||||
</span>
|
||||
<span class="flex items-center gap-1">
|
||||
<CalendarIcon aria-hidden="true" class="size-4 shrink-0" />
|
||||
{{ daysLeft() }} {{ daysLeft() === 1 ? 'day left' : 'days left' }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.pride-fundraiser-banner__progress :deep(.progress-bar) {
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
var(--color-red) 0%,
|
||||
var(--color-orange) 20%,
|
||||
var(--color-green) 50%,
|
||||
var(--color-blue) 75%,
|
||||
var(--color-purple) 100%
|
||||
);
|
||||
}
|
||||
</style>
|
||||
@@ -393,6 +393,7 @@ const messages = defineMessages({
|
||||
<FriendsSection
|
||||
v-if="pendingFriends.length > 0"
|
||||
:is-searching="!!search"
|
||||
open-by-default
|
||||
:friends="pendingFriends"
|
||||
:heading="formatMessage(messages.pending)"
|
||||
:remove-friend="removeFriend"
|
||||
|
||||
@@ -8,7 +8,6 @@ import {
|
||||
InstallationSettingsLayout,
|
||||
provideAppBackup,
|
||||
provideInstallationSettings,
|
||||
useDebugLogger,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import type { GameVersionTag, PlatformTag } from '@modrinth/utils'
|
||||
@@ -35,17 +34,9 @@ import type { Manifest } from '../../../helpers/types'
|
||||
const { handleError } = injectNotificationManager()
|
||||
const { formatMessage } = useVIntl()
|
||||
const queryClient = useQueryClient()
|
||||
const debug = useDebugLogger('AppInstallationSettings')
|
||||
|
||||
const { instance, offline, isMinecraftServer, onUnlinked, closeModal } = injectInstanceSettings()
|
||||
|
||||
debug('metadata load: start', {
|
||||
instancePath: instance.value.path,
|
||||
loader: instance.value.loader,
|
||||
gameVersion: instance.value.game_version,
|
||||
installStage: instance.value.install_stage,
|
||||
})
|
||||
|
||||
const [
|
||||
fabric_versions,
|
||||
forge_versions,
|
||||
@@ -81,15 +72,6 @@ const [
|
||||
.catch(handleError),
|
||||
])
|
||||
|
||||
debug('metadata load: done', {
|
||||
hasFabricManifest: !!fabric_versions?.value,
|
||||
hasForgeManifest: !!forge_versions?.value,
|
||||
hasQuiltManifest: !!quilt_versions?.value,
|
||||
hasNeoforgeManifest: !!neoforge_versions?.value,
|
||||
gameVersions: all_game_versions?.value?.length ?? 0,
|
||||
availablePlatforms: loaders?.value?.map((loader) => loader.name) ?? [],
|
||||
})
|
||||
|
||||
const { data: modpackInfo } = useQuery({
|
||||
queryKey: computed(() => ['linkedModpackInfo', instance.value.path]),
|
||||
queryFn: () => get_linked_modpack_info(instance.value.path, 'must_revalidate'),
|
||||
@@ -113,21 +95,11 @@ function getManifest(loader: string) {
|
||||
quilt: quilt_versions,
|
||||
neoforge: neoforge_versions,
|
||||
}
|
||||
const manifest = map[loader]
|
||||
debug('getManifest:', {
|
||||
loader,
|
||||
hasManifest: !!manifest?.value,
|
||||
gameVersions: manifest?.value?.gameVersions?.length ?? 0,
|
||||
})
|
||||
return manifest
|
||||
return map[loader]
|
||||
}
|
||||
|
||||
provideAppBackup({
|
||||
async createBackup() {
|
||||
debug('createBackup: start', {
|
||||
instancePath: instance.value.path,
|
||||
instanceName: instance.value.name,
|
||||
})
|
||||
const allProfiles = await list()
|
||||
const prefix = `${instance.value.name} - Backup #`
|
||||
const existingNums = allProfiles
|
||||
@@ -137,7 +109,6 @@ provideAppBackup({
|
||||
const nextNum = existingNums.length > 0 ? Math.max(...existingNums) + 1 : 1
|
||||
const newPath = await duplicate(instance.value.path)
|
||||
await edit(newPath, { name: `${prefix}${nextNum}` })
|
||||
debug('createBackup: done', { newPath, backupName: `${prefix}${nextNum}` })
|
||||
},
|
||||
})
|
||||
|
||||
@@ -194,72 +165,32 @@ provideInstallationSettings({
|
||||
const manifest = getManifest(loader)
|
||||
return !!manifest?.value?.gameVersions?.some((x) => item.version === x.id)
|
||||
})
|
||||
const result = (
|
||||
showSnapshots ? filtered : filtered.filter((x) => x.version_type === 'release')
|
||||
).map((x) => ({ value: x.version, label: x.version }))
|
||||
debug('resolveGameVersions:', {
|
||||
loader,
|
||||
showSnapshots,
|
||||
totalVersions: versions.length,
|
||||
filteredVersions: filtered.length,
|
||||
resultVersions: result.length,
|
||||
})
|
||||
return result
|
||||
return (showSnapshots ? filtered : filtered.filter((x) => x.version_type === 'release')).map(
|
||||
(x) => ({ value: x.version, label: x.version }),
|
||||
)
|
||||
},
|
||||
|
||||
resolveLoaderVersions(loader, gameVersion) {
|
||||
if (loader === 'vanilla' || !gameVersion) {
|
||||
debug('resolveLoaderVersions: skipped', { loader, gameVersion })
|
||||
return []
|
||||
}
|
||||
if (loader === 'vanilla' || !gameVersion) return []
|
||||
const manifest = getManifest(loader)
|
||||
if (!manifest?.value) {
|
||||
debug('resolveLoaderVersions: no manifest', { loader, gameVersion })
|
||||
return []
|
||||
}
|
||||
if (!manifest?.value) return []
|
||||
if (loader === 'fabric' || loader === 'quilt') {
|
||||
const result = manifest.value.gameVersions[0]?.loaders ?? []
|
||||
debug('resolveLoaderVersions: fabric/quilt result', {
|
||||
loader,
|
||||
gameVersion,
|
||||
count: result.length,
|
||||
})
|
||||
return result
|
||||
return manifest.value.gameVersions[0]?.loaders ?? []
|
||||
}
|
||||
const result =
|
||||
manifest.value.gameVersions?.find((item) => item.id === gameVersion)?.loaders ?? []
|
||||
debug('resolveLoaderVersions: result', { loader, gameVersion, count: result.length })
|
||||
return result
|
||||
return manifest.value.gameVersions?.find((item) => item.id === gameVersion)?.loaders ?? []
|
||||
},
|
||||
|
||||
resolveHasSnapshots(loader) {
|
||||
const versions = all_game_versions?.value ?? []
|
||||
if (loader === 'vanilla') {
|
||||
const result = versions.some((x) => x.version_type !== 'release')
|
||||
debug('resolveHasSnapshots: vanilla', { loader, result })
|
||||
return result
|
||||
}
|
||||
if (loader === 'vanilla') return versions.some((x) => x.version_type !== 'release')
|
||||
const manifest = getManifest(loader)
|
||||
const supported = versions.filter(
|
||||
(item) => !!manifest?.value?.gameVersions?.some((x) => item.version === x.id),
|
||||
)
|
||||
const result = supported.some((x) => x.version_type !== 'release')
|
||||
debug('resolveHasSnapshots:', {
|
||||
loader,
|
||||
totalVersions: versions.length,
|
||||
supportedVersions: supported.length,
|
||||
result,
|
||||
})
|
||||
return result
|
||||
return supported.some((x) => x.version_type !== 'release')
|
||||
},
|
||||
|
||||
async save(platform, gameVersion, loaderVersionId) {
|
||||
debug('save: called', {
|
||||
instancePath: instance.value.path,
|
||||
platform,
|
||||
gameVersion,
|
||||
loaderVersionId,
|
||||
})
|
||||
const editProfile: Record<string, string | undefined> = {
|
||||
loader: platform,
|
||||
game_version: gameVersion,
|
||||
@@ -268,21 +199,17 @@ provideInstallationSettings({
|
||||
editProfile.loader_version = loaderVersionId
|
||||
}
|
||||
await edit(instance.value.path, editProfile).catch(handleError)
|
||||
debug('save: edit complete', { editProfile })
|
||||
},
|
||||
|
||||
afterSave: async () => {
|
||||
debug('afterSave: installing', { instancePath: instance.value.path })
|
||||
await install(instance.value.path, false).catch(handleError)
|
||||
trackEvent('InstanceRepair', {
|
||||
loader: instance.value.loader,
|
||||
game_version: instance.value.game_version,
|
||||
})
|
||||
debug('afterSave: done')
|
||||
},
|
||||
|
||||
async repair() {
|
||||
debug('repair: called', { instancePath: instance.value.path })
|
||||
repairing.value = true
|
||||
await install(instance.value.path, true).catch(handleError)
|
||||
repairing.value = false
|
||||
@@ -290,11 +217,9 @@ provideInstallationSettings({
|
||||
loader: instance.value.loader,
|
||||
game_version: instance.value.game_version,
|
||||
})
|
||||
debug('repair: done')
|
||||
},
|
||||
|
||||
async reinstallModpack() {
|
||||
debug('reinstallModpack: called', { instancePath: instance.value.path })
|
||||
reinstalling.value = true
|
||||
await update_repair_modrinth(instance.value.path).catch(handleError)
|
||||
reinstalling.value = false
|
||||
@@ -302,11 +227,9 @@ provideInstallationSettings({
|
||||
loader: instance.value.loader,
|
||||
game_version: instance.value.game_version,
|
||||
})
|
||||
debug('reinstallModpack: done')
|
||||
},
|
||||
|
||||
async unlinkModpack() {
|
||||
debug('unlinkModpack: called', { instancePath: instance.value.path })
|
||||
await edit(instance.value.path, {
|
||||
linked_data: null as unknown as undefined,
|
||||
})
|
||||
@@ -314,38 +237,27 @@ provideInstallationSettings({
|
||||
queryKey: ['linkedModpackInfo', instance.value.path],
|
||||
})
|
||||
onUnlinked()
|
||||
debug('unlinkModpack: done')
|
||||
},
|
||||
|
||||
getCachedModpackVersions: () => null,
|
||||
async fetchModpackVersions() {
|
||||
debug('fetchModpackVersions: called', {
|
||||
projectId: instance.value.linked_data?.project_id,
|
||||
})
|
||||
const versions = await get_project_versions(instance.value.linked_data!.project_id!).catch(
|
||||
handleError,
|
||||
)
|
||||
debug('fetchModpackVersions: done', { count: versions?.length ?? 0 })
|
||||
return (versions ?? []) as Labrinth.Versions.v2.Version[]
|
||||
},
|
||||
|
||||
async getVersionChangelog(versionId: string) {
|
||||
debug('getVersionChangelog: called', { versionId })
|
||||
return (await get_version(versionId, 'must_revalidate').catch(
|
||||
() => null,
|
||||
)) as Labrinth.Versions.v2.Version | null
|
||||
},
|
||||
|
||||
async onModpackVersionConfirm(version) {
|
||||
debug('onModpackVersionConfirm: called', {
|
||||
versionId: version.id,
|
||||
instancePath: instance.value.path,
|
||||
})
|
||||
await update_managed_modrinth_version(instance.value.path, version.id)
|
||||
await queryClient.invalidateQueries({
|
||||
queryKey: ['linkedModpackInfo', instance.value.path],
|
||||
})
|
||||
debug('onModpackVersionConfirm: done')
|
||||
},
|
||||
|
||||
updaterModalProps: computed(() => ({
|
||||
|
||||
@@ -10,9 +10,8 @@ import type { ColorTheme, FeatureFlag } from '@/store/theme.ts'
|
||||
const themeStore = useTheming()
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
const worldsInHomeFlag: FeatureFlag = 'worlds_in_home'
|
||||
const skipUnknownPackWarningFlag: FeatureFlag = 'skip_unknown_pack_warning'
|
||||
const showPlayTimeFlag: FeatureFlag = 'show_instance_play_time'
|
||||
const worldsInHomeFeatureFlag = 'worlds_in_home' as FeatureFlag
|
||||
const skipUnknownPackWarningFeatureFlag = 'skip_unknown_pack_warning' as FeatureFlag
|
||||
|
||||
const messages = defineMessages({
|
||||
colorThemeTitle: {
|
||||
@@ -101,14 +100,6 @@ const messages = defineMessages({
|
||||
defaultMessage:
|
||||
"If you attempt to install a Modrinth Pack file (.mrpack) that isn't hosted on Modrinth, we'll make sure you understand the risks before installing it.",
|
||||
},
|
||||
showPlayTimeTitle: {
|
||||
id: 'app.appearance-settings.show-play-time.title',
|
||||
defaultMessage: 'Show play time',
|
||||
},
|
||||
showPlayTimeDescription: {
|
||||
id: 'app.appearance-settings.show-play-time.description',
|
||||
defaultMessage: `Displays how much time you've spent playing an instance.`,
|
||||
},
|
||||
})
|
||||
|
||||
const os = ref(await getOS())
|
||||
@@ -162,6 +153,25 @@ watch(
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex items-center justify-between">
|
||||
<div>
|
||||
<h2 class="m-0 text-lg font-semibold text-contrast">
|
||||
{{ formatMessage(messages.hideNametagTitle) }}
|
||||
</h2>
|
||||
<p class="m-0 mt-1">{{ formatMessage(messages.hideNametagDescription) }}</p>
|
||||
</div>
|
||||
<Toggle
|
||||
id="hide-nametag-skins-page"
|
||||
:model-value="themeStore.hideNametagSkinsPage"
|
||||
@update:model-value="
|
||||
(e) => {
|
||||
themeStore.hideNametagSkinsPage = !!e
|
||||
settings.hide_nametag_skins_page = themeStore.hideNametagSkinsPage
|
||||
}
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div v-if="os !== 'MacOS'" class="mt-6 flex items-center justify-between gap-4">
|
||||
<div>
|
||||
<h2 class="m-0 text-lg font-semibold text-contrast">
|
||||
@@ -182,44 +192,6 @@ watch(
|
||||
<Toggle id="minimize-launcher" v-model="settings.hide_on_process_start" />
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex items-center justify-between">
|
||||
<div>
|
||||
<h2 class="m-0 text-lg font-semibold text-contrast">
|
||||
{{ formatMessage(messages.showPlayTimeTitle) }}
|
||||
</h2>
|
||||
<p class="m-0 mt-1">{{ formatMessage(messages.showPlayTimeDescription) }}</p>
|
||||
</div>
|
||||
<Toggle
|
||||
:model-value="themeStore.getFeatureFlag(showPlayTimeFlag)"
|
||||
@update:model-value="
|
||||
() => {
|
||||
const newValue = !themeStore.getFeatureFlag(showPlayTimeFlag)
|
||||
themeStore.featureFlags[showPlayTimeFlag] = newValue
|
||||
settings.feature_flags[showPlayTimeFlag] = newValue
|
||||
}
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex items-center justify-between">
|
||||
<div>
|
||||
<h2 class="m-0 text-lg font-semibold text-contrast">
|
||||
{{ formatMessage(messages.hideNametagTitle) }}
|
||||
</h2>
|
||||
<p class="m-0 mt-1">{{ formatMessage(messages.hideNametagDescription) }}</p>
|
||||
</div>
|
||||
<Toggle
|
||||
id="hide-nametag-skins-page"
|
||||
:model-value="themeStore.hideNametagSkinsPage"
|
||||
@update:model-value="
|
||||
(e) => {
|
||||
themeStore.hideNametagSkinsPage = !!e
|
||||
settings.hide_nametag_skins_page = themeStore.hideNametagSkinsPage
|
||||
}
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flex items-center justify-between">
|
||||
<div>
|
||||
<h2 class="m-0 text-lg font-semibold text-contrast">
|
||||
@@ -254,12 +226,12 @@ watch(
|
||||
<p class="m-0 mt-1">{{ formatMessage(messages.jumpBackIntoWorldsDescription) }}</p>
|
||||
</div>
|
||||
<Toggle
|
||||
:model-value="themeStore.getFeatureFlag(worldsInHomeFlag)"
|
||||
:model-value="themeStore.getFeatureFlag(worldsInHomeFeatureFlag)"
|
||||
@update:model-value="
|
||||
() => {
|
||||
const newValue = !themeStore.getFeatureFlag(worldsInHomeFlag)
|
||||
themeStore.featureFlags[worldsInHomeFlag] = newValue
|
||||
settings.feature_flags[worldsInHomeFlag] = newValue
|
||||
const newValue = !themeStore.getFeatureFlag(worldsInHomeFeatureFlag)
|
||||
themeStore.featureFlags[worldsInHomeFeatureFlag] = newValue
|
||||
settings.feature_flags[worldsInHomeFeatureFlag] = newValue
|
||||
}
|
||||
"
|
||||
/>
|
||||
@@ -273,13 +245,13 @@ watch(
|
||||
<p class="m-0 mt-1">{{ formatMessage(messages.unknownPackWarningDescription) }}</p>
|
||||
</div>
|
||||
<Toggle
|
||||
:model-value="!themeStore.getFeatureFlag(skipUnknownPackWarningFlag)"
|
||||
:model-value="!themeStore.getFeatureFlag(skipUnknownPackWarningFeatureFlag)"
|
||||
@update:model-value="
|
||||
(e) => {
|
||||
const warnBeforeUnknownPackInstall = !!e
|
||||
const skipUnknownPackWarning = !warnBeforeUnknownPackInstall
|
||||
themeStore.featureFlags[skipUnknownPackWarningFlag] = skipUnknownPackWarning
|
||||
settings.feature_flags[skipUnknownPackWarningFlag] = skipUnknownPackWarning
|
||||
themeStore.featureFlags[skipUnknownPackWarningFeatureFlag] = skipUnknownPackWarning
|
||||
settings.feature_flags[skipUnknownPackWarningFeatureFlag] = skipUnknownPackWarning
|
||||
}
|
||||
"
|
||||
/>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import { DropdownIcon, EditIcon, PlusIcon, TrashIcon, UnknownIcon } from '@modrinth/assets'
|
||||
import { DropdownIcon, EditIcon, PlusIcon, TrashIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Accordion,
|
||||
ButtonStyled,
|
||||
@@ -11,7 +11,6 @@ import {
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { useElementSize, useWindowSize } from '@vueuse/core'
|
||||
import { Tooltip } from 'floating-vue'
|
||||
import { computed, nextTick, onUnmounted, ref, useTemplateRef, watch } from 'vue'
|
||||
|
||||
import type { RenderResult } from '@/helpers/rendering/batch-skin-renderer.ts'
|
||||
@@ -25,7 +24,6 @@ type AddSkinButtonRef = SkinLikeTextButtonExpose | SkinLikeTextButtonExpose[]
|
||||
|
||||
interface DefaultSkinSection {
|
||||
title: string
|
||||
infoTooltip?: string
|
||||
skins: Skin[]
|
||||
}
|
||||
|
||||
@@ -33,7 +31,6 @@ interface SkinSection {
|
||||
key: string
|
||||
title: string
|
||||
kind: SkinSectionKind
|
||||
infoTooltip?: string
|
||||
skins: Skin[]
|
||||
}
|
||||
|
||||
@@ -148,7 +145,6 @@ const sections = computed<SkinSection[]>(() => [
|
||||
key: defaultSkinSectionKey(section.title),
|
||||
title: section.title,
|
||||
kind: 'default' as const,
|
||||
infoTooltip: section.infoTooltip,
|
||||
skins: section.skins,
|
||||
})),
|
||||
])
|
||||
@@ -334,24 +330,6 @@ defineExpose({ getAddSkinButtonElement })
|
||||
<span class="min-w-0 text-xl font-semibold leading-7 text-primary">
|
||||
{{ section.title }}
|
||||
</span>
|
||||
<Tooltip
|
||||
v-if="section.infoTooltip"
|
||||
theme="dismissable-prompt"
|
||||
placement="top"
|
||||
:triggers="['hover', 'focus']"
|
||||
>
|
||||
<span
|
||||
class="inline-flex size-6 shrink-0 items-center justify-center text-secondary transition-colors group-hover:text-primary"
|
||||
@click.stop
|
||||
>
|
||||
<UnknownIcon class="size-5" />
|
||||
</span>
|
||||
<template #popper>
|
||||
<p class="m-0 max-w-96 text-wrap text-sm font-medium leading-tight">
|
||||
{{ section.infoTooltip }}
|
||||
</p>
|
||||
</template>
|
||||
</Tooltip>
|
||||
</template>
|
||||
|
||||
<div
|
||||
|
||||
@@ -98,10 +98,6 @@ export async function friend_listener(callback) {
|
||||
return await listen('friend', (event) => callback(event.payload))
|
||||
}
|
||||
|
||||
export async function notification_listener(callback) {
|
||||
return await listen('notification', (event) => callback(event.payload))
|
||||
}
|
||||
|
||||
/// Payload for the 'log' event
|
||||
/*
|
||||
LogPayload {
|
||||
|
||||
@@ -10,7 +10,6 @@ export interface LoadingBarType {
|
||||
version?: string
|
||||
profile_path?: string
|
||||
pack_name?: string
|
||||
icon?: string | null
|
||||
}
|
||||
|
||||
export interface LoadingBar {
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
import type { Labrinth } from '@modrinth/api-client'
|
||||
|
||||
const MIDAS_BITFLAG = 1 << 0
|
||||
const PRIDE_26_MIDAS_DURATION_MS = 30 * 24 * 60 * 60 * 1000
|
||||
|
||||
type Pride26Campaign = Labrinth.Users.v3.Pride26CampaignDonation | null | undefined
|
||||
|
||||
export function hasMidasBadge(user?: { badges?: number } | null) {
|
||||
return !!user?.badges && (user.badges & MIDAS_BITFLAG) === MIDAS_BITFLAG
|
||||
}
|
||||
|
||||
export function hasPride26Badge(campaign: Pride26Campaign) {
|
||||
return campaign?.has_badge === true
|
||||
}
|
||||
|
||||
export function hasActivePride26Midas(campaign: Pride26Campaign, now = Date.now()) {
|
||||
if (campaign?.has_midas !== true) {
|
||||
return false
|
||||
}
|
||||
|
||||
const donatedAt = new Date(campaign.last_donated_at).getTime()
|
||||
return Number.isFinite(donatedAt) && donatedAt + PRIDE_26_MIDAS_DURATION_MS > now
|
||||
}
|
||||
@@ -5,36 +5,9 @@
|
||||
"app.action-bar.downloads": {
|
||||
"message": "التنزيلات"
|
||||
},
|
||||
"app.action-bar.hide-more-running-instances": {
|
||||
"message": "إخفاء المزيد من الحالات قيد التشغيل"
|
||||
},
|
||||
"app.action-bar.make-primary-instance": {
|
||||
"message": "إنشاء نسخة أساسية"
|
||||
},
|
||||
"app.action-bar.no-instances-running": {
|
||||
"message": "لا توجد نسخ قيد التشغيل"
|
||||
},
|
||||
"app.action-bar.offline": {
|
||||
"message": "غير متصل"
|
||||
},
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "النسخة ألرئيسية"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "عرض المزيد من النسخ قيد التشغيل"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "إيقاف النسخة"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "عرض التحميلات الفعالة"
|
||||
},
|
||||
"app.action-bar.view-instance": {
|
||||
"message": "عرض النسخة"
|
||||
},
|
||||
"app.action-bar.view-logs": {
|
||||
"message": "عرض التسجيل"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.home": {
|
||||
"message": "صفحة الرئيسية"
|
||||
},
|
||||
@@ -608,9 +581,6 @@
|
||||
"minecraft-account.select-account": {
|
||||
"message": "اختيار الحساب"
|
||||
},
|
||||
"minecraft-account.sign-in": {
|
||||
"message": "سجل دخولك لـ ماينكرافت"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "مقدَّم من النسخة"
|
||||
},
|
||||
@@ -634,8 +604,5 @@
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "يتم توفير المحمّل من قبل الخادم"
|
||||
},
|
||||
"unknown-pack-warning-modal.dont-show-again": {
|
||||
"message": "لا تعرض هذا التحذير مجددا"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,9 +35,6 @@
|
||||
"app.action-bar.view-logs": {
|
||||
"message": "Vis logs"
|
||||
},
|
||||
"app.appearance-settings.advanced-rendering.description": {
|
||||
"message": "Aktiverer avanceret gengivelse som sløringseffekter, der kan forårsage ydelsesproblemer uden hardwareaccelereret gengivelse."
|
||||
},
|
||||
"app.appearance-settings.advanced-rendering.title": {
|
||||
"message": "Avanceret rendering"
|
||||
},
|
||||
@@ -80,12 +77,6 @@
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "Vælg en mulighed"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "Aktivere muligheden for at slå sidepanelet til og fra."
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.title": {
|
||||
"message": "Slå sidepanel til og fra"
|
||||
},
|
||||
"app.appearance-settings.unknown-pack-warning.description": {
|
||||
"message": "Hvis du prøver at installere en Modrinth Pack fil (.mrpack) som ikke er hosted på Modrinth, så skal vi nok sikre os du forstår riskoen før du installere den."
|
||||
},
|
||||
@@ -98,15 +89,6 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Kan ikke nå autentificeringsservere"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Tilføjet server til instance"
|
||||
},
|
||||
"app.browse.add-to-an-instance": {
|
||||
"message": "Tilføj til en instance"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Tilføj til instance"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Tilføjet til {instanceName}"
|
||||
},
|
||||
@@ -116,33 +98,18 @@
|
||||
"app.browse.already-added": {
|
||||
"message": "Allerede tilføjet"
|
||||
},
|
||||
"app.browse.back-to-instance": {
|
||||
"message": "Tilbage til instance"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Opdag indhold"
|
||||
},
|
||||
"app.browse.discover-servers": {
|
||||
"message": "Opdag servere"
|
||||
},
|
||||
"app.browse.hide-added-servers": {
|
||||
"message": "Gem allerede tilføjet til servere"
|
||||
},
|
||||
"app.browse.project-type.modpacks": {
|
||||
"message": "Modpacks"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "Ved at tilføje indhold kan der opstå kompatibilitetsproblemer, når du tilslutter dig serveren. Alt tilføjet indhold går desuden tabt, når du opdaterer indholdet på din server instance."
|
||||
},
|
||||
"app.browse.server.installing": {
|
||||
"message": "Installere"
|
||||
},
|
||||
"app.creation-modal.installing-modpack.description": {
|
||||
"message": "{fileName}"
|
||||
},
|
||||
"app.creation-modal.installing-modpack.title": {
|
||||
"message": "Installere modpack..."
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Indtast modpack beskrivelse..."
|
||||
},
|
||||
@@ -152,18 +119,12 @@
|
||||
"app.export-modal.header": {
|
||||
"message": "Eksporter modpack"
|
||||
},
|
||||
"app.export-modal.include-file-accessibility-label": {
|
||||
"message": "Inkludere \"{file}\"?"
|
||||
},
|
||||
"app.export-modal.modpack-name-label": {
|
||||
"message": "Modpack Navn"
|
||||
},
|
||||
"app.export-modal.modpack-name-placeholder": {
|
||||
"message": "Modpack navn"
|
||||
},
|
||||
"app.export-modal.select-files-label": {
|
||||
"message": "Konfigurer hvilke filer inkludere i denne eksport"
|
||||
},
|
||||
"app.export-modal.version-number-label": {
|
||||
"message": "Versionsnummer"
|
||||
},
|
||||
@@ -188,12 +149,6 @@
|
||||
"app.instance.modpack-already-installed.create": {
|
||||
"message": "Opret"
|
||||
},
|
||||
"app.instance.modpack-already-installed.header": {
|
||||
"message": "Modpack allerede installeret"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "Instance"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "projekt"
|
||||
},
|
||||
@@ -212,42 +167,6 @@
|
||||
"app.instance.mods.successfully-uploaded": {
|
||||
"message": "Uploadet"
|
||||
},
|
||||
"app.instance.worlds.add-server": {
|
||||
"message": "Tilføj server"
|
||||
},
|
||||
"app.instance.worlds.browse-servers": {
|
||||
"message": "Søg servere"
|
||||
},
|
||||
"app.instance.worlds.delete-world-title": {
|
||||
"message": "Er du sikker på din vil slette denne verden permanent?"
|
||||
},
|
||||
"app.instance.worlds.filter-modded": {
|
||||
"message": "Moddet"
|
||||
},
|
||||
"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": "Tilføj en server, eller søg efter en for at komme i gang"
|
||||
},
|
||||
"app.instance.worlds.no-worlds-heading": {
|
||||
"message": "Ingen servere eller verdener tilføjet"
|
||||
},
|
||||
"app.instance.worlds.remove-server-title": {
|
||||
"message": "Er du sikker på din vil fjerne {name}?"
|
||||
},
|
||||
"app.instance.worlds.search-worlds-placeholder": {
|
||||
"message": "Søg {count} verdener..."
|
||||
},
|
||||
"app.instance.worlds.this-server": {
|
||||
"message": "denne server"
|
||||
},
|
||||
"app.modal.install-to-play.content-required": {
|
||||
"message": "Indhold krævet"
|
||||
},
|
||||
@@ -284,15 +203,6 @@
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "En opdatering er krævet for at spille {name}. Venligst opdater til den seneste version for at køre spillet."
|
||||
},
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Dette projekt er allerede installeret"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Tilbage til udforsk"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "Installer indhold til instance"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Udvikler-tilstand aktiveret."
|
||||
},
|
||||
@@ -317,48 +227,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Ressourcestyring"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Tilføj skin"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Træk og slip"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Brug"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Slet skin"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Dette vil permanent slette det valgte skin. Dette vil ikke kunne blive fortydes."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Er du sikker på, at du vil slette dette skin?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Fejl ved læsning af den afleverede fil."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Fejl under behandling af fil"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Rediger skin"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Tilføj skin"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Tilføjer et skin"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Slank"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Bred"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Kappe"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} er klar til at blive installeret! Genindlæs for at opdatere nu, eller automatisk når du lukker Modrinth App."
|
||||
},
|
||||
@@ -701,9 +569,6 @@
|
||||
"instance.worlds.world_in_use": {
|
||||
"message": "Verden er i brug"
|
||||
},
|
||||
"minecraft-account.remove-account": {
|
||||
"message": "Fjern konto"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "Givet af instanceen"
|
||||
},
|
||||
|
||||
@@ -294,7 +294,7 @@
|
||||
"message": "Dieses Projekt ist bereits installiert"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Zurück zu Entdecken"
|
||||
"message": "Zurück zum Entdecken"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "Inhalt in Instanz installieren"
|
||||
@@ -323,147 +323,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Ressourcenmanagement"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Skin hinzufügen"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Drag-and-Drop"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Anwenden"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Skin löschen"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Dies wird den ausgewählten Skin unwiderruflich löschen. Diese Aktion kann nicht rückgängig gemacht werden."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Bist du dir sicher, dass du diesen Skin löschen willst?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Die abgelegte Datei konnte nicht gelesen werden."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Fehler bei der Verarbeitung der Datei"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Skin bearbeiten"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Skin hinzufügen"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Skin wird hinzugefügt"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Arm Stil"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Schlank"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Breit"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Umhang"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Umhang"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Skin bearbeiten"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Nimm zuerst eine Änderung am Skin vor!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Kein Umhang"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Keinen"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Textur ersetzen"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Skin speichern"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Wird gespeichert..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textur"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Lade zuerst ein Skin hoch!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Skin bearbeiten"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Vorschau"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Du wechselst dein Skin zu oft. Die Server von Mojang haben weitere Anfragen vorübergehend blockiert. Bitte warte einen Moment, bevor du es erneut versuchst."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Langsamer!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Standard-Skins"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Du hast diese Skins erhalten, da du während des Pride-Monats für eine Modrinth-Pride-Spendenaktion gespendet hast."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Gespeicherte Skins"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Anmelden"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Bitte melde dich bei deinem Minecraft-Konto an, um die Funktionen zur Skin-Verwaltung der Modrinth-App nutzen zu können."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Begeisterter Modrinth-Bot"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Bitte melde dich an"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Skin-Auswahl"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} ist bereit zur Installation! Lade die App neu um jetzt zu aktualisieren, oder automatisch nach dem schliessen der Modrinth App."
|
||||
},
|
||||
@@ -743,24 +602,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java und Arbeitsspeicher"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Benutzerdefinierte Umgebungsvariablen"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Benutzerdefinierte Java-Argumente"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Benutzerdefinierte Java-Installation"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Benutzerdefinierte Speicherzuweisung"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Umgebungsvariablen eingeben..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Java-Argumente eingeben..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Umgebungsvariablen"
|
||||
},
|
||||
@@ -776,9 +617,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Zugewiesener Arbeitsspeicher"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/pfad/zu/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Spielfenster"
|
||||
},
|
||||
|
||||
@@ -323,147 +323,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Ressourcenmanagement"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Skin hinzufügen"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Ziehen und Ablegen"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Anwenden"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Skin löschen"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Dadurch wird der ausgewählte Skin permanent gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Möchtest du diesen Skin wirklich löschen?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Die abgelegte Datei konnte nicht gelesen werden."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Fehler bei der Verarbeitung der Datei"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Skin bearbeiten"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Skin hinzufügen"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Einen Skin hinzufügen"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Arm-Stil"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Schlank"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Breit"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Umhang"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Umhang"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Skin bearbeiten"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Nimm zuerst eine Änderung am Skin vor!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Kein Umhang"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Keinen"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Textur ersetzen"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Skin speichern"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Wird gespeichert..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textur"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Lade zuerst ein Skin hoch!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Skin bearbeiten"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Vorschau"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Du wechselst dein Skin zu oft. Die Server von Mojang haben weitere Anfragen vorübergehend blockiert. Bitte warte einen Moment, bevor du es erneut versuchst."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Langsamer!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Standard-Skins"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Du hast diese Skins erhalten, da du während des Pride-Monats für eine Modrinth-Pride-Spendenaktion gespendet hast."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Gespeicherte Skins"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Anmelden"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Bitte melde dich bei deinem Minecraft-Konto an, um die Funktionen zur Skin-Verwaltung der Modrinth-App nutzen zu können."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Begeisterter Modrinth-Bot"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Bitte melde dich an"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Skin-Auswahl"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} ist bereit zur Installation! Neu laden, um jetzt zu aktualisieren, oder automatisch, wenn du die Modrinth App schließt."
|
||||
},
|
||||
@@ -743,24 +602,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java und Arbeitsspeicher"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Benutzerdefinierte Umgebungsvariablen"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Benutzerdefinierte Java-Argumente"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Benutzerdefinierte Java-Installation"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Benutzerdefinierte Speicherzuweisung"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Umgebungsvariablen eingeben..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Java-Argumente eingeben..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Umgebungsvariablen"
|
||||
},
|
||||
@@ -776,9 +617,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Zugewiesener Arbeitsspeicher"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/pfad/zu/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Fenster"
|
||||
},
|
||||
|
||||
@@ -86,12 +86,6 @@
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "Select an option"
|
||||
},
|
||||
"app.appearance-settings.show-play-time.description": {
|
||||
"message": "Displays how much time you've spent playing an instance."
|
||||
},
|
||||
"app.appearance-settings.show-play-time.title": {
|
||||
"message": "Show play time"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "Enables the ability to toggle the sidebar."
|
||||
},
|
||||
@@ -437,15 +431,6 @@
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "You received these skins for donating to a Modrinth Pride fundraiser during Pride Month."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
|
||||
@@ -291,10 +291,10 @@
|
||||
"message": "Se requiere una actualización para jugar {name}. Por favor, actualiza a la versión más reciente para iniciar el juego."
|
||||
},
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Este proyecto ya está instalado"
|
||||
"message": "Este proyecto está actualmente instalado"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Volver a descubrir contenido"
|
||||
"message": "Volver al explorador"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "Instalar contenido a la instancia"
|
||||
@@ -323,138 +323,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gestión de recursos"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Añadir skin"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Arrastrar y soltar"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Aplicar"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Eliminar skin"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Esto eliminará permanentemente el skin seleccionado. Esta acción no se puede deshacer."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "¿Estás seguro de que quieres eliminar este skin?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Error al leer el archivo arrastrado."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Error al procesar el archivo"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Editar skin"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Añadir skin"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Añadiendo un skin"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Estilo de brazo"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Delgado"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Ancho"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Capa"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Capa"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Editando skin"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "¡Primero edita el skin!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Sin capa"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Ninguna"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Remplazar textura"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Guardar skin"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Guardando..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textura"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "¡Primero carga un skin!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Editar skin"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Previsualizando"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Estás cambiando tu skin muy frecuentemente. Los servidores de Mojang han bloqueado temporalmente las solicitdues futuras. Por favor, espera un momento antes de volver a intentarlo."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "¡Más despacio!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Constructores y Biomas"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Persigue los Cielos"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Skins predeterminadas"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Monturas del Caos"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Skins guardados"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "La Era del Cobre"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "El Jardín Despierta"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Bebés al Poder"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Iniciar sesión"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Por favor, inicia sesión en tu cuenta de Minecraft para poder utilizar las funciones de gestión de skins de la Modrinth App."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Modrinth Bot emocionado"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Por favor, inicia sesión"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Selector de skin"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "¡Modrinth App v{version} está lista para instalarse! Actualiza ahora o automáticamente al cerrar la Modrinth App."
|
||||
},
|
||||
@@ -768,7 +636,7 @@
|
||||
"message": "Memoria asignada"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/ruta/de/java"
|
||||
"message": "/ruta/a/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Ventana"
|
||||
|
||||
@@ -332,15 +332,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gestión de recursos"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Añadir skin"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Arrastrar y soltar"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Aplicar"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "¡La versión v{version} de Modrinth está lista para instalarse! Actualiza ahora o automáticamente al cerrar la aplicación."
|
||||
},
|
||||
|
||||
@@ -104,12 +104,6 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Hindi maabot ang mga authentication server"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Idinaragdag ang server sa instansiya"
|
||||
},
|
||||
"app.browse.add-to-an-instance": {
|
||||
"message": "Idagdag sa instansiya"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Idagdag sa instansiya"
|
||||
},
|
||||
@@ -122,9 +116,6 @@
|
||||
"app.browse.already-added": {
|
||||
"message": "Nadagdag na"
|
||||
},
|
||||
"app.browse.back-to-instance": {
|
||||
"message": "Bumalik sa instansiya"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Tumuklas ng kontento"
|
||||
},
|
||||
@@ -137,9 +128,6 @@
|
||||
"app.browse.project-type.modpacks": {
|
||||
"message": "Modpacks"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "Maaaring makasisira sa pagkakatugma sa pagsasali ng server ang pagdaragdag ng kontento. Ang anumang kontento ay mawawala sa pag-update ng kontento ng instansiyang pang-server."
|
||||
},
|
||||
"app.browse.server.installing": {
|
||||
"message": "Ini-install"
|
||||
},
|
||||
@@ -299,12 +287,6 @@
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "Kailangang mag-update upang malaro ang {name}. Mangyaring mag-update sa pinakabagong bersiyon upang ma-launch ang laro."
|
||||
},
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Naka-install na ang proyektong ito"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Bumalik sa pagtutuklas"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Binuksan ang moda ng nagdi-develop."
|
||||
},
|
||||
@@ -329,36 +311,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Pamamahala ng paglalaan"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Ilapat"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Payat"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Malapad"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Kapa"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Kapa"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Walang kapa"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Wala"
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Texture"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Ang Modrinth App v{version} ay handa nang ma-install. Mag-reload upang ma-update ngayon, o awtomatiko sa pagsara ng Modrinth App."
|
||||
},
|
||||
|
||||
@@ -323,147 +323,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gestion des ressources"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Ajouter une skin"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Glisser et déposer"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Appliquer"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Supprimer la skin"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Cela va supprimer de manière permanente cette skin. Cette action est irréversible."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Êtes-vous sûr de vouloir supprimer cette skin ?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Impossible de lire le fichier déposé."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Erreur lors du traitement du fichier"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Modifier la skin"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Ajouter une skin"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Ajouter une skin"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Bras"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Mince"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Large"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Cape"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Cape"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Modification de la skin"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Faites d'abord une modification à la skin !"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Aucune cape"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Aucune"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Remplacer la texture"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Sauvegarder la skin"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Sauvegarde..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Texture"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Importez d'abord une skin !"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Modifier la skin"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Aperçu"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Vous changez de skin trop vite. Les serveurs de Mojang ont temporairement bloqué certaines requêtes. Veuillez patienter un moment puis réessayez."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Du calme !"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chassez les cieux"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Skins par défaut"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Vous avez reçu ces skins pour avoir fait un don à une collecte de fonds Modrinth Pride pendant le mois de la fierté."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Montures en pagaille"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Skins sauvegardées"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "L'éveil du jardin"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Horde miniature"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Se connecter"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Veuillez vous connecter à votre compte Minecraft pour utiliser les fonctionnalités de gestion de skins de Modrinth App."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Bot Modrinth enthousiaste"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Veuillez vous connecter"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Sélecteur de skin"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -773,9 +632,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Mémoire allouée"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/chemin/vers/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Fenêtre"
|
||||
},
|
||||
|
||||
@@ -1,16 +1,4 @@
|
||||
{
|
||||
"app.action-bar.downloads": {
|
||||
"message": "הורדות"
|
||||
},
|
||||
"app.action-bar.offline": {
|
||||
"message": "לא מקוון"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": ""
|
||||
},
|
||||
"app.appearance-settings.advanced-rendering.description": {
|
||||
"message": "מאפשר עיבוד מתקדם כגון אפקטים טשטוש העלולים לגרום לבעיות ביצועים ללא עיבוד מואץ לחומרה."
|
||||
},
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "ייתכן ששרתי האימות של Minecraft מושבתים כרגע. יש לבדוק את חיבור האינטרנט שלך ולנסות שוב מאוחר יותר."
|
||||
},
|
||||
|
||||
@@ -6,31 +6,31 @@
|
||||
"message": "Letöltések"
|
||||
},
|
||||
"app.action-bar.hide-more-running-instances": {
|
||||
"message": "További futó példányok elrejtése"
|
||||
"message": "További futó profilok elrejtése"
|
||||
},
|
||||
"app.action-bar.make-primary-instance": {
|
||||
"message": "Beállítás elsődleges példányként"
|
||||
"message": "Beállítás elsődleges profilként"
|
||||
},
|
||||
"app.action-bar.no-instances-running": {
|
||||
"message": "Nincsenek futó példányok"
|
||||
"message": "Nincsenek futó profilok"
|
||||
},
|
||||
"app.action-bar.offline": {
|
||||
"message": "Offline"
|
||||
},
|
||||
"app.action-bar.primary-instance": {
|
||||
"message": "Elsődleges példány"
|
||||
"message": "Elsődleges profil"
|
||||
},
|
||||
"app.action-bar.show-more-running-instances": {
|
||||
"message": "További futó pédányok megjelenítése"
|
||||
"message": "További futó profilok megjelenítése"
|
||||
},
|
||||
"app.action-bar.stop-instance": {
|
||||
"message": "Példány leállítása"
|
||||
"message": "Profil megállítása"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "Aktív letöltések megtekintése"
|
||||
},
|
||||
"app.action-bar.view-instance": {
|
||||
"message": "Példányok megtekintése"
|
||||
"message": "Profil megtekintése"
|
||||
},
|
||||
"app.action-bar.view-logs": {
|
||||
"message": "Naplók megtekintése"
|
||||
@@ -60,7 +60,7 @@
|
||||
"message": "Alapértelmezett nyitóoldal"
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.description": {
|
||||
"message": "Letiltja a játékosod felett megjelenő névcímkét a Kinézetek oldalon."
|
||||
"message": "Letiltja a játékosod felett megjelenő névcímkét a Skinek oldalon."
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.title": {
|
||||
"message": "Névcímke eltüntetése"
|
||||
@@ -105,13 +105,13 @@
|
||||
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Szerver hozzáadása az példányhoz"
|
||||
"message": "Szerver hozzáadása a profilhoz"
|
||||
},
|
||||
"app.browse.add-to-an-instance": {
|
||||
"message": "Hozzáadás egy példányhoz"
|
||||
"message": "Hozzáadás egy profilhoz"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Példányhoz adás"
|
||||
"message": "Hozzáadás a profilhoz"
|
||||
},
|
||||
"app.browse.add-to-instance-name": {
|
||||
"message": "Hozzáadás ehhez: {instanceName}"
|
||||
@@ -123,7 +123,7 @@
|
||||
"message": "Már hozzá van adva"
|
||||
},
|
||||
"app.browse.back-to-instance": {
|
||||
"message": "Vissza a példányhoz"
|
||||
"message": "Vissza a profilhoz"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "Tartalom böngészése"
|
||||
@@ -198,7 +198,7 @@
|
||||
"message": "A modcsomag már telepítve van"
|
||||
},
|
||||
"app.instance.modpack-already-installed.instance": {
|
||||
"message": "Példány"
|
||||
"message": "Profil"
|
||||
},
|
||||
"app.instance.mods.content-type-project": {
|
||||
"message": "projekt"
|
||||
@@ -329,138 +329,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Erőforráskezelés"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Kinézet hozzáadása"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Húzd ide a fájlt"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Alkalmazás"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Kinézet törlése"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Ezzel a kiválasztott kinézet véglegesen törlődik. Ez a művelet visszafordíthatatlan."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Biztos, hogy le akarod törölni ezt a kinézetet?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Nem sikerült beolvasni a feltöltött fájlt."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Hiba a fájl feldolgozása közben"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Kinézet szerkesztése"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Kinézet hozzáadása"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Kinézet hozzáadása"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Karstílus"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Vékony"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Széles"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Köpeny"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Köpeny"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Kinézet szerkesztése"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Előbb módosíts valamit!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Nincs köpeny"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Nincs"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Textúra cseréje"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Kinézet mentése"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Mentés..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textúra"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Először tölts fel egy kinézetet!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Kinézet szerkesztése"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Előnézet"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Túl gyakran cseréled a kinézetedet. A Mojang szerverei ideiglenesen letiltották a további cseréket. Kérlek várj egy pillanatot, majd próbáld meg újra."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Lassíts!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Alap kinézetek"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Mentett kinézetek"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Bejelentkezés"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Kérlek jelentkezz be a Minecraft-fiókodba, hogy használni tudd a Modrinth App kinézetkezelési funkcióit."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Izgatott Modrinth-bot"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Kérlek jelentkezz be"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Kinézetváltó"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "A Modrinth App v{version} telepítésre kész! Frissítéshez válaszd ki a Frissítés opciót, vagy az alkalmazás a bezárásakor automatikusan frissül."
|
||||
},
|
||||
@@ -737,24 +605,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java és memória"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Egyéni környezeti változók"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Egyéni Java argumentumok"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Egyedi Java telepítés"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Egyéni memóriakiosztás"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Írja be a környezeti változókat..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Java argumentumok megadása..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Környezeti változók"
|
||||
},
|
||||
@@ -770,9 +620,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Hozzárendelt memória"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/path/to/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Ablak"
|
||||
},
|
||||
|
||||
@@ -56,45 +56,21 @@
|
||||
"app.appearance-settings.default-landing-page.library": {
|
||||
"message": "Pustaka"
|
||||
},
|
||||
"app.appearance-settings.default-landing-page.title": {
|
||||
"message": "Halaman arahan bawaan"
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.description": {
|
||||
"message": "Mematikan label nama di atas wujud pemain Anda pada halaman rupa."
|
||||
},
|
||||
"app.appearance-settings.hide-nametag.title": {
|
||||
"message": "Sembunyikan label nama"
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.description": {
|
||||
"message": "Menyertakan dunia terkini dalam bagian \"Masuk kembali\" pada Beranda."
|
||||
},
|
||||
"app.appearance-settings.jump-back-into-worlds.title": {
|
||||
"message": "Masuk kembali ke dunia"
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.description": {
|
||||
"message": "Kecilkan pluncur ketika proses Minecraft berjalan."
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.title": {
|
||||
"message": "Kecilkan peluncur"
|
||||
},
|
||||
"app.appearance-settings.native-decorations.description": {
|
||||
"message": "Gunakan bingkai jendela sistem (wajib menjalankan ulang aplikasi)."
|
||||
},
|
||||
"app.appearance-settings.native-decorations.title": {
|
||||
"message": "Hiasan asli"
|
||||
},
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "Pilih opsi"
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.description": {
|
||||
"message": "Menghidupkan kemampuan untuk menghidupkan dan mematikan bilah sisi."
|
||||
},
|
||||
"app.appearance-settings.toggle-sidebar.title": {
|
||||
"message": "Hidup/matikan bilah sisi"
|
||||
},
|
||||
"app.appearance-settings.unknown-pack-warning.description": {
|
||||
"message": "Bila Anda mencoba memasangkan berkas Modrinth Pack (.mrpack) yang tidak dihoskan pada Modrinth, kami akan memastikan Anda untuk memahami risikonya sebelum memasangkannya."
|
||||
},
|
||||
"app.appearance-settings.unknown-pack-warning.title": {
|
||||
"message": "Peringatkan saya sebelum memasang paket mod tidak dikenal"
|
||||
},
|
||||
@@ -137,9 +113,6 @@
|
||||
"app.browse.project-type.modpacks": {
|
||||
"message": "Paket Mod"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "Menambah konten dapat merusak kompatibilitas saat bergabung ke server. Konten tambahan apa pun akan hilang ketika Anda memperbarui konten instans server."
|
||||
},
|
||||
"app.browse.server.installing": {
|
||||
"message": "Memasang"
|
||||
},
|
||||
@@ -296,12 +269,6 @@
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "{name} perlu diperbarui sebelum dimainkan. Mohon perbarui ke versi terkini untuk meluncurkan permainan."
|
||||
},
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Proyek ini sudah terpasang"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Kembali ke halaman pencarian"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "Pasang konten ke instans"
|
||||
},
|
||||
@@ -329,147 +296,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Manajemen sumber"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Tambah rupa"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Seret dan lepas"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Terapkan"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Hapus rupa"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Ini akan menghapus rupa terpilih secara permanen. Tindakan ini tidak dapat dibatalkan."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Apakah Anda yakin ingin menghapus rupa ini?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Gagal membaca berkas yang diletakkan."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Kesalahan dalam memroses berkas"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Sunting rupa"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Tambah rupa"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Menambah rupa"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Gaya lengan"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Ramping"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Lebar"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Jubah"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Jubah"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Menyunting rupa"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Sunting rupa terlebih dahulu!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Tanpa jubah"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Tidak ada"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Ganti tekstur"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Simpan rupa"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Menyimpan..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Tekstur"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Unggah rupa terlebih dahulu!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Sunting rupa"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Mempratinjau"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Anda terlalu sering mengganti rupa Anda. Server Mojang telah memblokir permintaan lebih lanjut untuk sementara. Mohon tunggu sebentar sebelum mencoba lagi."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Pelan-pelan!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Rupa bawaan"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Anda mendapat rupa ini karena telah berdonasi ke penggalangan dana Modrinth Pride saat Pride Month."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Rupa tersimpan"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Masuk"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Mohon masuk ke akun Minecraft Anda untuk menggunakan fitur pengelolaan rupa dari Modrinth App."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Bot Modrinth penuh antusias"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Silakan masuk"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Pemilih rupa"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} siap dipasang! Muat ulang untuk memperbarui sekarang, atau secara otomatis saat Anda menutup Modrinth App."
|
||||
},
|
||||
@@ -746,24 +572,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java dan memori"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Variabel lingkungan tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Argumen Java tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Pemasangan Java tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Alokasi memori tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Masukkan variabel lingkungan..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Masukkan argumen Java..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Variabel lingkungan"
|
||||
},
|
||||
@@ -779,9 +587,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Memori yang teralokasikan"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/jalur/ke/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Jendela"
|
||||
},
|
||||
@@ -869,9 +674,6 @@
|
||||
"minecraft-account.select-account": {
|
||||
"message": "Pilih akun"
|
||||
},
|
||||
"minecraft-account.sign-in": {
|
||||
"message": "Masuk ke Minecraft"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "Disediakan oleh instans"
|
||||
},
|
||||
@@ -896,9 +698,6 @@
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Pemuat disediakan oleh server"
|
||||
},
|
||||
"unknown-pack-warning-modal.body": {
|
||||
"message": "Berkas hanya akan ditinjau bila ia diunggah ke Modrinth, tak peduli format berkasnya (termasuk .mrpack)."
|
||||
},
|
||||
"unknown-pack-warning-modal.dont-show-again": {
|
||||
"message": "Jangan tampilkan peringatan ini lagi"
|
||||
},
|
||||
@@ -908,9 +707,6 @@
|
||||
"unknown-pack-warning-modal.install-anyway": {
|
||||
"message": "Tetap pasang"
|
||||
},
|
||||
"unknown-pack-warning-modal.malware-statement": {
|
||||
"message": "Program jahat (malware) dibagikan melalui berkas paket mod dengan membagikannya melalui platform seperti Discord."
|
||||
},
|
||||
"unknown-pack-warning-modal.warning.body": {
|
||||
"message": "Kami tidak dapat menemukan berkas ini di Modrinth. Kami sangat menyarankan Anda untuk hanya memasang berkas dari sumber-sumber terpercaya."
|
||||
},
|
||||
|
||||
@@ -320,147 +320,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gestione delle risorse"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Nuova skin"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Trascina e rilascia"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Applica"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Elimina"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Questa skin sarà rimossa per sempre. Quest'azione non può essere annullata."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Vuoi davvero eliminare questa skin?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Non è stato possibile leggere il file rilasciato."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Impossibile processare il file"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Modifica"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Salva"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Aggiungi una nuova skin"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Modello del giocatore"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Snello"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Largo"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Mantello"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Mantello"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Modifica la skin"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Modifica la skin prima!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Nessun mantello"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Nessuno"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Sfoglia"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Salva"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Salvataggio..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "File della skin"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Carica una skin prima!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Modifica"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Anteprima"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Stai modificando la skin troppo spesso. I server di Mojang hanno limitato le nostre richieste. Aspetta un momento prima di riprovare."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Rallenta!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Skin predefinite"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Pride Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Hai ottenuto queste skin per aver donato alla raccolta fondi per il Pride durante il Pride Month."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Raccolta"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Accedi"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Accedi col tuo account Minecraft per usare la gestione delle skin."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Modrinth Bot emozionato"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Accedi"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Seleziona una skin"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} è pronta per essere installata! Ricarica per aggiornare ora, o avverrà in automatico alla chiusura dell'app."
|
||||
},
|
||||
|
||||
@@ -332,135 +332,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "리소스 관리"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "스킨 추가"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "드레그 엔 드롭"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "적용"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "스킨 지우기"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "선택한 스킨이 영구적으로 삭제됩니다. 이 작업은 되돌릴 수 없습니다."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "이 스킨을 정말 삭제하시겠습니까?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "삭제된 파일을 읽는 데 실패했습니다."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "파일 처리 중 오류가 발생했습니다."
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "스킨 편집"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "스킨 추가"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "스킨 추가"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "팔 형테"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Slim"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Wide"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "망토"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "망토"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "스킨 수정"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "먼저 스킨을 수정하세요"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "망토 없음"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "망토 없음"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "찾아보기"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "스킨 저장하기"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "저장중..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "스킨 파일"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "먼저 스킨을 업로드하세요"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "스킨 수정"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "미리보기"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "스킨을 너무 자주 변경하고 있습니다. Mojang 서버에서 일시적으로 추가 요청을 차단했습니다. 잠시 후 다시 시도해 주세요."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "잠시 기다려주세요."
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "기본 스킨"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "저장된 스킨"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "로그인"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Modrinth 앱의 스킨 관리 기능을 사용하려면 Minecraft 계정에 로그인하세요."
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "로그인하세요"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "스킨 선택"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version}을 설치할 준비가 완료되었습니다! 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
|
||||
},
|
||||
|
||||
@@ -299,9 +299,6 @@
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Projek ini sudah dipasang"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Kembali menemukan"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "Pasang kandungan ke dalam pemasangan"
|
||||
},
|
||||
@@ -605,21 +602,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java dan ingatan"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Pembolehubah persekitaran tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Argumen Java tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Pemasangan Java tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Peruntukan ingatan tersuai"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Masukkan argumen Java..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Pembolehubah persekitaran"
|
||||
},
|
||||
@@ -635,9 +617,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Ingatan yang diperuntukkan"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/laluan/ke/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Tetingkap"
|
||||
},
|
||||
|
||||
@@ -326,69 +326,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Zarządzanie zasobami"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Dodaj skina"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Zastosuj"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Usuń skina"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Edytuj skina"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Dodaj skina"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Dodawanie skina"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Peleryna"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Pelerynki"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Edytuj skina"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Brak peleryny"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Nic"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Zapisz skina"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Zapisywanie..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Tekstura"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Edytuj skina"
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Zwolnij!"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Domyślne skiny"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Zaloguj Się"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Proszę zaloguj się"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Wybierz skina"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Wersja Modrinth App v{version} jest gotowa do zainstalowania! Załaduj ponownie, żeby zaktualizować teraz, albo automatycznie, gdy zamkniesz Modrinth App."
|
||||
},
|
||||
@@ -665,24 +602,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java i pamięć"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Zmienne środowiskowe"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Niestandardowe argumenty Java"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Niestandardowa instalacja Javy"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Niestandardowa alokacja pamięci"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Zmienne środowiskowe..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Argumenty Javy..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Zmienne środowiskowe"
|
||||
},
|
||||
@@ -698,9 +617,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Przypisana pamięć"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/path/to/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Okno"
|
||||
},
|
||||
|
||||
@@ -329,147 +329,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Gerenciamento de recursos"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Adicionar skin"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Arraste e solte"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Aplicar"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Excluir skin"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Isto permanentemente deletará a skin selecionada. Esta ação não pode ser desfeita."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Tem certeza de que deseja excluir esta skin?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Falha ao ler o arquivo solto."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Erro ao processar o arquivo"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Editar skin"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Adicionar skin"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Adicionando skin"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Estilo do braço"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Fino"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Largo"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Capa"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Capa"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Editando skin"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Primeiro, faça uma edição na skin!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Sem capa"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Nenhum"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Substituir textura"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Salvar skin"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Salvando..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textura"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Primeiro, faça o envio de uma skin!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Editar skin"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Pré-visualizando"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Você está trocando de skin com muita frequência. Os servidores da Mojang bloquearam temporariamente novas solicitações. Aguarde um momento antes de tentar novamente."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Vá mais devagar!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Construtores & Biomas"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Skins padrões"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Orgulho LGBTQIA+ do Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Você recebeu estas skins por doar para uma campanha de arrecadação de fundos do Orgulho LGBTQIA+ do Modrinth durante o Mês do Orgulho."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Skins salvas"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "A Era do Cobre"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Fazer login"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Faça login na sua conta do Minecraft para usar os recursos de gerenciamento de skins do Modrinth app."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Modrinth Bot animado"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Por favor, faça login"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Seletor de skin"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "O Modrinth App v{version} está pronto para ser instalado! Você pode recarregar para atualizar agora ou a atualização será feita automaticamente ao fechar o Modrinth App."
|
||||
},
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"message": "Скачивание Java {version}"
|
||||
},
|
||||
"app.action-bar.downloads": {
|
||||
"message": "Загрузки"
|
||||
"message": "Скачивание"
|
||||
},
|
||||
"app.action-bar.hide-more-running-instances": {
|
||||
"message": "Скрыть другие активные сборки"
|
||||
@@ -27,7 +27,7 @@
|
||||
"message": "Остановить сборку"
|
||||
},
|
||||
"app.action-bar.view-active-downloads": {
|
||||
"message": "Посмотреть текущие загрузки"
|
||||
"message": "Посмотреть текущие скачивания"
|
||||
},
|
||||
"app.action-bar.view-instance": {
|
||||
"message": "Посмотреть сборку"
|
||||
@@ -138,7 +138,7 @@
|
||||
"message": "Сборки"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "Добавление контента может сломать совместимость при подключении к серверу. Весь добавленный контент также будет удалён при обновлении сервера."
|
||||
"message": "Добавление контента может нарушить совместимость при подключении к серверу. Также весь добавленный контент будет удалён при обновлении содержимого серверной сборки."
|
||||
},
|
||||
"app.browse.server.installing": {
|
||||
"message": "Установка"
|
||||
@@ -314,141 +314,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Управление ресурсами"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Добавить скин"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Перетащите сюда"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Применить"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Удалить скин"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Выбранный скин будет удалён навсегда. Это действие необратимо."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Вы действительно хотите удалить этот скин?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Не удалось прочитать перетащенный файл."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Ошибка обработки файла"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Изменить скин"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Добавить скин"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Добавление скина"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Руки"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Тонкие"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Широкие"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Плащ"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Плащ"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Настройка скина"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Сначала внесите изменения в скин!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Без плаща"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Нет"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Заменить текстуру"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Сохранить скин"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Сохранение..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Текстура"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Сначала загрузите скин!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Изменить"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Предпросмотр"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Слишком частая смена скина. Серверы Mojang временно заблокировали дальнейшие запросы. Подождите немного, прежде чем попробовать снова."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Не так быстро!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Стандартные скины"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Сохранённые скины"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Войти"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Чтобы использовать функции управления скинами Modrinth App, войдите в свою учётную запись Minecraft."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Восторженный Modrinth Bot"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Войдите"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Выбор скина"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Версия Modrinth App {version} готова к установке! Перезапустите приложение, чтобы обновить его, или оно обновится автоматически после закрытия."
|
||||
},
|
||||
@@ -723,19 +588,19 @@
|
||||
"message": "Java и память"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Переопределение переменных среды"
|
||||
"message": "Пользовательские настройки запуска"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Переопределение аргументов Java"
|
||||
"message": "Пользовательские аргументы Java"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Переопределение расположения Java"
|
||||
"message": "Пользовательская установка Java"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Переопределение выделенной памяти"
|
||||
"message": "Пользовательский объём памяти"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Введите переменные среды..."
|
||||
"message": "Введите дополнительные параметры системы..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Введите аргументы Java..."
|
||||
|
||||
@@ -56,18 +56,6 @@
|
||||
"app.appearance-settings.hide-nametag.title": {
|
||||
"message": "Dölj namnskylt"
|
||||
},
|
||||
"app.appearance-settings.minimize-launcher.title": {
|
||||
"message": "Minimera programstartare"
|
||||
},
|
||||
"app.appearance-settings.native-decorations.description": {
|
||||
"message": "Använd systemets fönsterram (omstart av app krävs)."
|
||||
},
|
||||
"app.appearance-settings.native-decorations.title": {
|
||||
"message": "Inbyggda fönsterdekorationer"
|
||||
},
|
||||
"app.appearance-settings.select-option": {
|
||||
"message": "Välj ett alternativ"
|
||||
},
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Minecrafts autentiseringsservrar kan vara nere just nu. Kontrollera din internetanslutning och försök igen senare."
|
||||
},
|
||||
@@ -98,9 +86,6 @@
|
||||
"app.browse.server.installing": {
|
||||
"message": "Installerar"
|
||||
},
|
||||
"app.creation-modal.installing-modpack.description": {
|
||||
"message": "{fileName}"
|
||||
},
|
||||
"app.export-modal.description-placeholder": {
|
||||
"message": "Ange modpaketets beskrivning..."
|
||||
},
|
||||
@@ -110,9 +95,6 @@
|
||||
"app.export-modal.header": {
|
||||
"message": "Exportera modpaket"
|
||||
},
|
||||
"app.export-modal.include-file-accessibility-label": {
|
||||
"message": "Inkludera \"{file}\"?"
|
||||
},
|
||||
"app.export-modal.modpack-name-label": {
|
||||
"message": "Modpaketets namn"
|
||||
},
|
||||
@@ -272,60 +254,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Resurshantering"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Lägg till utseende"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Ta bort utseende"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Redigera utseende"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Lägg till utseende"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Lägga till ett utseende"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Arm stil"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Smal"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Bred"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Mantel"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Mantel"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Redigerar utseende"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Gör en ändring på utseendet först!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Ingen mantel"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Ingen"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Byt ut textur"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Spara utseende"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Sparar..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Textur"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} är redo att laddas ner! Ladda om för att uppdatera nu, eller automatiskt när du stänger Modrinth App."
|
||||
},
|
||||
@@ -692,24 +620,6 @@
|
||||
"instance.worlds.world_in_use": {
|
||||
"message": "Värld används"
|
||||
},
|
||||
"minecraft-account.add-account": {
|
||||
"message": "Lägg till konto"
|
||||
},
|
||||
"minecraft-account.label": {
|
||||
"message": "Minecraft konto"
|
||||
},
|
||||
"minecraft-account.not-signed-in": {
|
||||
"message": "Inte inloggad"
|
||||
},
|
||||
"minecraft-account.remove-account": {
|
||||
"message": "Ta bort konto"
|
||||
},
|
||||
"minecraft-account.select-account": {
|
||||
"message": "Välj konto"
|
||||
},
|
||||
"minecraft-account.sign-in": {
|
||||
"message": "Logga in till Minecraft"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "Tillhandahållet av instansen"
|
||||
},
|
||||
@@ -733,8 +643,5 @@
|
||||
},
|
||||
"search.filter.locked.server-loader.title": {
|
||||
"message": "Loader tillhandahålls av servern"
|
||||
},
|
||||
"unknown-pack-warning-modal.install-anyway": {
|
||||
"message": "Installera ändå"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,12 +104,6 @@
|
||||
"app.auth-servers.unreachable.header": {
|
||||
"message": "Doğrulama sunucularına erişilemedi"
|
||||
},
|
||||
"app.browse.add-servers-to-instance": {
|
||||
"message": "Sunucuyu kuruluma ekle"
|
||||
},
|
||||
"app.browse.add-to-an-instance": {
|
||||
"message": "Bir kuruluma ekle"
|
||||
},
|
||||
"app.browse.add-to-instance": {
|
||||
"message": "Kuruluma ekle"
|
||||
},
|
||||
@@ -122,9 +116,6 @@
|
||||
"app.browse.already-added": {
|
||||
"message": "Zaten ekli"
|
||||
},
|
||||
"app.browse.back-to-instance": {
|
||||
"message": "Kuruluma dön"
|
||||
},
|
||||
"app.browse.discover-content": {
|
||||
"message": "İçerik keşfet"
|
||||
},
|
||||
@@ -137,9 +128,6 @@
|
||||
"app.browse.project-type.modpacks": {
|
||||
"message": "Mod paketleri"
|
||||
},
|
||||
"app.browse.server-instance-content-warning": {
|
||||
"message": "Yeni bir içerik eklemek sunucuya girerkenki uyumluluğu bozabilir. Herhangi eklenmiş içerik ise sunucu kurulumunu güncellemeye çalıştığınızda kaybolacaktır."
|
||||
},
|
||||
"app.browse.server.installing": {
|
||||
"message": "Yükleniyor"
|
||||
},
|
||||
@@ -158,18 +146,12 @@
|
||||
"app.export-modal.header": {
|
||||
"message": "Mod paketini dışa aktar"
|
||||
},
|
||||
"app.export-modal.include-file-accessibility-label": {
|
||||
"message": "\"{file}\" dahil mi?"
|
||||
},
|
||||
"app.export-modal.modpack-name-label": {
|
||||
"message": "Mod Paketi Adı"
|
||||
},
|
||||
"app.export-modal.modpack-name-placeholder": {
|
||||
"message": "Modpaketi adı"
|
||||
},
|
||||
"app.export-modal.select-files-label": {
|
||||
"message": "Bu dışa aktarmaya hangi dosyaların dahil edileceğini yapılandırma"
|
||||
},
|
||||
"app.export-modal.version-number-label": {
|
||||
"message": "Sürüm numarası"
|
||||
},
|
||||
@@ -299,15 +281,6 @@
|
||||
"app.modal.update-to-play.update-required-description": {
|
||||
"message": "{name} oyununu oynamak için güncelleme gereklidir. Oyunu başlatmak için lütfen en son sürüme güncelleyin."
|
||||
},
|
||||
"app.project.install-button.already-installed": {
|
||||
"message": "Bu proje zaten kurulu"
|
||||
},
|
||||
"app.project.install-context.back-to-browse": {
|
||||
"message": "Keşfete geri dön"
|
||||
},
|
||||
"app.project.install-context.install-content-to-instance": {
|
||||
"message": "İçeriği kuruluma yükle"
|
||||
},
|
||||
"app.settings.developer-mode-enabled": {
|
||||
"message": "Geliştirici modu açıldı."
|
||||
},
|
||||
@@ -332,138 +305,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Kaynak yönetimi"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Skin ekle"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Sürükle bırak"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Uygula"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Skin'i sil"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Bu seçilmiş skin'i kalıcı olarak silecektir. Bu işlem geri alınamaz."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Bu skin'i silmek istediğinize gerçekten emin misiniz?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Bıraktığınız dosya okunamadı."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Dosya işlenirken hata oluştu"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Skin'i düzenle"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Skin ekle"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Skin ekleme"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Kol stili"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "İnce"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Klasik"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Pelerin"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Pelerin"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Skin düzenleme"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Önce skin'e bir düzenleme yapın!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Pelerin yok"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Hiçbiri"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Dokuyu değiştir"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Skin'i kaydet"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Kaydediliyor..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Doku"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "İlk başta skin yükleyin!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Skin'i düzenle"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Önizleme"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Skin'inizi çok hızlı değiştiriyorsunuz. Mojang'ın sunucuları geçici olarak diğer istekleri engelledi. Lütfen tekrar denemeden önce biraz bekleyin."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Yavaşla!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "İnşaatçılar & Biyomlar"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Varsayılan skinler"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Kaydedilen Skinler"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Giriş Yap"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Modrinth appdeki skin yönetim özelliklerini kullanmak için lütfen Minecraft hesabınıza giriş yapın."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Heyecanlı Modrinth Bot'u"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Lütfen giriş yapın"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Skin seçici"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} güncellemesi indirilmeye hazır! Hemen güncellemek için yeniden başlatın veya Modrinth App’i kapattığınızda otomatik olarak güncellenecek."
|
||||
},
|
||||
@@ -740,24 +581,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java ve bellek"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "Özel ortam değişkenleri"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "Özel Java argümanları"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "Özel Java kurulumu"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "Özel bellek tahsisi"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "Ortam değişkenlerini girin..."
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "Java argümanlarını girin..."
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "Ortam değişkenleri"
|
||||
},
|
||||
@@ -773,9 +596,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "Ayrılan bellek"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/java/kurulum/yolu"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "Pencere"
|
||||
},
|
||||
|
||||
@@ -96,7 +96,7 @@
|
||||
"message": "Якщо ви спробуєте встановити файл пакета Modrinth (.mrpack), який не розміщено на Modrinth, ми переконаємося, що ви розумієте ризики, перш ніж установлювати його."
|
||||
},
|
||||
"app.appearance-settings.unknown-pack-warning.title": {
|
||||
"message": "Попередження перед установленням невідомих збірок"
|
||||
"message": "Попереджати мене перед установленням невідомих збірок"
|
||||
},
|
||||
"app.auth-servers.unreachable.body": {
|
||||
"message": "Сервери автентифікації Minecraft можуть зараз не працювати. Перевірте з’єднання з інтернетом та спробуйте пізніше."
|
||||
@@ -320,138 +320,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Керування ресурсами"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Додати скін"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Перетягніть і вставте"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Застосувати"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Видалити скін"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Це видалить вибраний скін назавжди. Ця дія не може бути скасована."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Чи ви впевнені що хочете видалити цей скін?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Неможливо відкрити вибраний файл."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Помилка обробки файлу"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Редагувати скін"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Додати скін"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Додавання скіна"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Стиль рук"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Тонкі"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Широкі"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Плащ"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Плащ"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Редагування скіна"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Відредагуйте скін для початку!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Без плаща"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Без"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Замінити текстуру"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Зберегти вигляд"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Збереження…"
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Текстура"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Завантажте скін для початку!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Редагувати скін"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Попередній перегляд"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Ви змінюєте свій скін дуже часто. Сервери Mojang тимчасово заблокували подальші запити. Зачекайте трохи перш ніж спробувати знову."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Шановний!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Усталені скіни"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Збережені скіни"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Увійдіть"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Будь ласка, увійдіть у свій обліковий запис Minecraft, щоб використовувати особливості керування скінами в Modrinth App."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Схвильований бот Modrinth"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Увійдіть"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Вибір скіну"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} готовий до встановлення! Перезапустіть, щоб оновити зараз. Або, оновлення буде здійснено автоматично, коли закриєте застосунок Modrinth."
|
||||
},
|
||||
@@ -840,10 +708,10 @@
|
||||
"message": "Додати обліковий запис"
|
||||
},
|
||||
"minecraft-account.label": {
|
||||
"message": "Обліковий запис Minecraft"
|
||||
"message": "Майнкрафт аккаунт"
|
||||
},
|
||||
"minecraft-account.not-signed-in": {
|
||||
"message": "Не авторизовано"
|
||||
"message": "Не ввійдено в систему"
|
||||
},
|
||||
"minecraft-account.remove-account": {
|
||||
"message": "Видалити обліковий запис"
|
||||
@@ -852,7 +720,7 @@
|
||||
"message": "Обрати обліковий запис"
|
||||
},
|
||||
"minecraft-account.sign-in": {
|
||||
"message": "Увійти в Minecraft"
|
||||
"message": "Увійти в Майнкрафт"
|
||||
},
|
||||
"search.filter.locked.instance": {
|
||||
"message": "Надано профілем"
|
||||
@@ -885,10 +753,10 @@
|
||||
"message": "Не показувати більше це попередження"
|
||||
},
|
||||
"unknown-pack-warning-modal.header": {
|
||||
"message": "Підтвердити встановлення"
|
||||
"message": "Підтвердити інсталяцію"
|
||||
},
|
||||
"unknown-pack-warning-modal.install-anyway": {
|
||||
"message": "Усе одно встановити"
|
||||
"message": "Усе одно інсталювати"
|
||||
},
|
||||
"unknown-pack-warning-modal.malware-statement": {
|
||||
"message": "Шкідливе програмне забезпечення часто поширюють через файли збірок, які публікуються на таких платформах, як Discord."
|
||||
|
||||
@@ -332,147 +332,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "Quản lý tài nguyên"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "Skin tự tạo"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "Kéo và thả"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "Áp dụng"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "Xóa skin"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "Hành động này sẽ xóa skin trên vĩnh viễn. Hành động này không thể khôi phục lại."
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "Bạn hoàn toàn muốn xóa skin này chứ?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "Không đọc được file thả."
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "Có lỗi khi đọc file"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "Sửa skin"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "Tạo skin"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "Tạo skin"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "Độ rộng cánh tay"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "Gầy"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "Béo"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "Cape"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "Cape"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "Sửa skin"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "Sửa skin trước đã!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "Không cape"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "Không"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "Đổi skin"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "Lưu skin"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "Đang lưu..."
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "Skin"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "Nhập skin vào trước đã!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "Sửa skin"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "Xem trước"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "Bạn đang chỉnh skin quá thường xuyên. Mãy chủ của Mojang đã tạm thời chặn lại các yêu cầu hiện thời. Đợi một lúc trước khi thử lại lần nữa."
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "Bình tĩnh lại!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "Builders & Biomes"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "Chase the Skies"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "Skin mặc định"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.modrinth-pride": {
|
||||
"message": "Modrinth Pride"
|
||||
},
|
||||
"app.skins.section.modrinth-pride.tooltip": {
|
||||
"message": "Bạn đã được tặng những skin này sau khi quyên góp cho Modrinth trong tháng Lẩu Gà Bình Thuận thế giới."
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "Mounts of Mayhem"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "Skin đã lưu"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "Striding Hero"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "The Copper Age"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "The Garden Awakens"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "Tiny Takeover"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "Đăng nhập"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "Đặng nhập vào mội tài khoản Minecraft để sử dụng trình sửa Skin trong ứng dụng này."
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "Bot phấn khích"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "Đăng nhập đã"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "Trình sửa skin"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Phiên bản v{version} của Modrinth đã được chuẩn bị để cài đặt! Khởi động lại ứng dụng để cập nhật ngay bây giờ, hoặc cập nhật tự động khi bạn đóng Modrinth."
|
||||
},
|
||||
|
||||
@@ -320,141 +320,6 @@
|
||||
"app.settings.tabs.resource-management": {
|
||||
"message": "资源管理"
|
||||
},
|
||||
"app.skins.add-button": {
|
||||
"message": "添加皮肤"
|
||||
},
|
||||
"app.skins.add-button.drag-and-drop": {
|
||||
"message": "拖放"
|
||||
},
|
||||
"app.skins.apply-button": {
|
||||
"message": "应用"
|
||||
},
|
||||
"app.skins.delete-button": {
|
||||
"message": "删除皮肤"
|
||||
},
|
||||
"app.skins.delete-modal.description": {
|
||||
"message": "这会永久删除所选皮肤。这操作无法撤销。"
|
||||
},
|
||||
"app.skins.delete-modal.title": {
|
||||
"message": "你确定要删除这个皮肤吗?"
|
||||
},
|
||||
"app.skins.dropped-file-error.text": {
|
||||
"message": "无法读取拖放的文件。"
|
||||
},
|
||||
"app.skins.dropped-file-error.title": {
|
||||
"message": "处理文件时出错"
|
||||
},
|
||||
"app.skins.edit-button": {
|
||||
"message": "编辑皮肤"
|
||||
},
|
||||
"app.skins.modal.add-skin-button": {
|
||||
"message": "添加皮肤"
|
||||
},
|
||||
"app.skins.modal.add-title": {
|
||||
"message": "添加皮肤中"
|
||||
},
|
||||
"app.skins.modal.arm-style-section": {
|
||||
"message": "手臂样式"
|
||||
},
|
||||
"app.skins.modal.arm-style-slim": {
|
||||
"message": "细"
|
||||
},
|
||||
"app.skins.modal.arm-style-wide": {
|
||||
"message": "粗"
|
||||
},
|
||||
"app.skins.modal.cape-fallback-name": {
|
||||
"message": "披风"
|
||||
},
|
||||
"app.skins.modal.cape-section": {
|
||||
"message": "披风"
|
||||
},
|
||||
"app.skins.modal.edit-title": {
|
||||
"message": "编辑皮肤中"
|
||||
},
|
||||
"app.skins.modal.make-edit-first-tooltip": {
|
||||
"message": "请先对皮肤进行编辑!"
|
||||
},
|
||||
"app.skins.modal.no-cape-tooltip": {
|
||||
"message": "无披风"
|
||||
},
|
||||
"app.skins.modal.none-cape-option": {
|
||||
"message": "无"
|
||||
},
|
||||
"app.skins.modal.replace-texture-button": {
|
||||
"message": "替换纹理"
|
||||
},
|
||||
"app.skins.modal.save-skin-button": {
|
||||
"message": "保存皮肤"
|
||||
},
|
||||
"app.skins.modal.saving-tooltip": {
|
||||
"message": "保存中……"
|
||||
},
|
||||
"app.skins.modal.texture-section": {
|
||||
"message": "纹理"
|
||||
},
|
||||
"app.skins.modal.upload-skin-first-tooltip": {
|
||||
"message": "请先上传皮肤!"
|
||||
},
|
||||
"app.skins.preview.edit-button": {
|
||||
"message": "编辑皮肤"
|
||||
},
|
||||
"app.skins.previewing-badge": {
|
||||
"message": "预览"
|
||||
},
|
||||
"app.skins.rate-limit.text": {
|
||||
"message": "你更改皮肤过于频繁。Mojang服务器已暂时阻止了后续请求。请稍等片刻后再试。"
|
||||
},
|
||||
"app.skins.rate-limit.title": {
|
||||
"message": "慢点!"
|
||||
},
|
||||
"app.skins.section.builders-and-biomes": {
|
||||
"message": "建造者与生物群系"
|
||||
},
|
||||
"app.skins.section.chase-the-skies": {
|
||||
"message": "追逐苍穹"
|
||||
},
|
||||
"app.skins.section.default-skins": {
|
||||
"message": "默认皮肤"
|
||||
},
|
||||
"app.skins.section.minecon-earth-2017": {
|
||||
"message": "MINECON Earth 2017"
|
||||
},
|
||||
"app.skins.section.modrinth": {
|
||||
"message": "Modrinth"
|
||||
},
|
||||
"app.skins.section.mounts-of-mayhem": {
|
||||
"message": "暴乱坐骑"
|
||||
},
|
||||
"app.skins.section.saved-skins": {
|
||||
"message": "已保存皮肤"
|
||||
},
|
||||
"app.skins.section.striding-hero": {
|
||||
"message": "阔步英雄"
|
||||
},
|
||||
"app.skins.section.the-copper-age": {
|
||||
"message": "铜器时代"
|
||||
},
|
||||
"app.skins.section.the-garden-awakens": {
|
||||
"message": "花园苏醒"
|
||||
},
|
||||
"app.skins.section.tiny-takeover": {
|
||||
"message": "微小占领"
|
||||
},
|
||||
"app.skins.sign-in.button": {
|
||||
"message": "登录"
|
||||
},
|
||||
"app.skins.sign-in.description": {
|
||||
"message": "请登录您的 Minecraft 账号,以便使用 Modrinth 应用的皮肤管理功能。"
|
||||
},
|
||||
"app.skins.sign-in.rinthbot-alt": {
|
||||
"message": "兴奋的 Modrinth Bot"
|
||||
},
|
||||
"app.skins.sign-in.title": {
|
||||
"message": "请登录"
|
||||
},
|
||||
"app.skins.title": {
|
||||
"message": "皮肤选择器"
|
||||
},
|
||||
"app.update-popup.body": {
|
||||
"message": "Modrinth App v{version} 更新已就绪!立即重启更新,或退出时自动安装。"
|
||||
},
|
||||
@@ -731,24 +596,6 @@
|
||||
"instance.settings.tabs.java": {
|
||||
"message": "Java 及内存"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-environment-variables": {
|
||||
"message": "自定义环境变量"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-arguments": {
|
||||
"message": "自定义Java参数"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-java-installation": {
|
||||
"message": "自定义Java安装"
|
||||
},
|
||||
"instance.settings.tabs.java.custom-memory-allocation": {
|
||||
"message": "自定义内存分配"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-environment-variables": {
|
||||
"message": "输入环境变量……"
|
||||
},
|
||||
"instance.settings.tabs.java.enter-java-arguments": {
|
||||
"message": "输入 Java 参数……"
|
||||
},
|
||||
"instance.settings.tabs.java.environment-variables": {
|
||||
"message": "环境变量"
|
||||
},
|
||||
@@ -764,9 +611,6 @@
|
||||
"instance.settings.tabs.java.java-memory": {
|
||||
"message": "内存分配"
|
||||
},
|
||||
"instance.settings.tabs.java.java-path-placeholder": {
|
||||
"message": "/path/to/java"
|
||||
},
|
||||
"instance.settings.tabs.window": {
|
||||
"message": "游戏窗口"
|
||||
},
|
||||
|
||||
@@ -13,14 +13,11 @@ import {
|
||||
commonMessages,
|
||||
ConfirmModal,
|
||||
defineMessages,
|
||||
injectAuth,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
SkinPreviewRenderer,
|
||||
useVIntl,
|
||||
} from '@modrinth/ui'
|
||||
import { arrayBufferToBase64 } from '@modrinth/utils'
|
||||
import { useQuery } from '@tanstack/vue-query'
|
||||
import { type DragDropEvent, getCurrentWebview } from '@tauri-apps/api/webview'
|
||||
import { computedAsync } from '@vueuse/core'
|
||||
import type { Ref } from 'vue'
|
||||
@@ -47,7 +44,6 @@ import {
|
||||
normalize_skin_texture,
|
||||
remove_custom_skin,
|
||||
} from '@/helpers/skins.ts'
|
||||
import { hasPride26Badge } from '@/helpers/user-campaigns.ts'
|
||||
import { handleSevereError } from '@/store/error'
|
||||
import { useTheming } from '@/store/state'
|
||||
|
||||
@@ -57,25 +53,11 @@ type VirtualSkinSectionListExpose = {
|
||||
}
|
||||
|
||||
const PENDING_SKIN_REFRESH_DELAY_MS = 11_000
|
||||
const DEFAULT_SKIN_SECTION_SORT_ORDER = ['Default skins', 'Modrinth Pride']
|
||||
const messages = defineMessages({
|
||||
skinSelectorTitle: {
|
||||
id: 'app.skins.title',
|
||||
defaultMessage: 'Skin selector',
|
||||
},
|
||||
modrinthPrideSection: {
|
||||
id: 'app.skins.section.modrinth-pride',
|
||||
defaultMessage: 'Modrinth Pride',
|
||||
},
|
||||
modrinthPrideTooltip: {
|
||||
id: 'app.skins.section.modrinth-pride.tooltip',
|
||||
defaultMessage:
|
||||
'You received these skins for donating to a Modrinth Pride fundraiser during Pride Month.',
|
||||
},
|
||||
modrinthSection: {
|
||||
id: 'app.skins.section.modrinth',
|
||||
defaultMessage: 'Modrinth',
|
||||
},
|
||||
defaultSkinsSection: {
|
||||
id: 'app.skins.section.default-skins',
|
||||
defaultMessage: 'Default skins',
|
||||
@@ -175,8 +157,6 @@ const skinSectionList = useTemplateRef<VirtualSkinSectionListExpose>('skinSectio
|
||||
const { formatMessage } = useVIntl()
|
||||
const notifications = injectNotificationManager()
|
||||
const { addNotification, handleError } = notifications
|
||||
const auth = injectAuth()
|
||||
const client = injectModrinthClient()
|
||||
|
||||
const themeStore = useTheming()
|
||||
const skins = ref<Skin[]>([])
|
||||
@@ -200,42 +180,22 @@ const savedSkins = computed(() => {
|
||||
return []
|
||||
}
|
||||
})
|
||||
const { data: modrinthUser } = useQuery({
|
||||
queryKey: computed(() => ['authenticated-user', 'campaigns', auth.user.value?.id]),
|
||||
queryFn: () => client.labrinth.users_v3.getAuthenticated(),
|
||||
enabled: () => !!auth.session_token.value,
|
||||
retry: false,
|
||||
})
|
||||
const hasModrinthPrideCampaign = computed(
|
||||
() => !!auth.session_token.value && hasPride26Badge(modrinthUser.value?.campaigns?.pride_26),
|
||||
)
|
||||
const defaultSkins = computed(() =>
|
||||
filterDefaultSkins(skins.value).filter(
|
||||
(skin) => skin.section !== 'Modrinth Pride' || hasModrinthPrideCampaign.value,
|
||||
),
|
||||
)
|
||||
const defaultSkins = computed(() => filterDefaultSkins(skins.value))
|
||||
const defaultSkinSections = computed(() => {
|
||||
const sections = new Map<string, Skin[]>()
|
||||
|
||||
for (const skin of defaultSkins.value) {
|
||||
const section = skin.section ?? 'Default skins'
|
||||
const sectionSkins = sections.get(section)
|
||||
const sectionTitle = getDefaultSkinSectionTitle(skin.section)
|
||||
const sectionSkins = sections.get(sectionTitle)
|
||||
|
||||
if (sectionSkins) {
|
||||
sectionSkins.push(skin)
|
||||
} else {
|
||||
sections.set(section, [skin])
|
||||
sections.set(sectionTitle, [skin])
|
||||
}
|
||||
}
|
||||
|
||||
return Array.from(sections, ([section, skins]) => ({
|
||||
section,
|
||||
title: getDefaultSkinSectionTitle(section),
|
||||
infoTooltip: getDefaultSkinSectionInfoTooltip(section),
|
||||
skins,
|
||||
})).sort(
|
||||
(a, b) => getDefaultSkinSectionSortIndex(a.section) - getDefaultSkinSectionSortIndex(b.section),
|
||||
)
|
||||
return Array.from(sections, ([title, skins]) => ({ title, skins }))
|
||||
})
|
||||
|
||||
const currentCape = computed(() => {
|
||||
@@ -343,10 +303,6 @@ function isMinecraftSkinRateLimitError(error: unknown) {
|
||||
|
||||
function getDefaultSkinSectionTitle(section?: string) {
|
||||
switch (section) {
|
||||
case 'Modrinth Pride':
|
||||
return formatMessage(messages.modrinthPrideSection)
|
||||
case 'Modrinth':
|
||||
return formatMessage(messages.modrinthSection)
|
||||
case 'MINECON Earth 2017':
|
||||
return formatMessage(messages.mineconEarth2017Section)
|
||||
case 'Builders & Biomes':
|
||||
@@ -370,20 +326,6 @@ function getDefaultSkinSectionTitle(section?: string) {
|
||||
}
|
||||
}
|
||||
|
||||
function getDefaultSkinSectionInfoTooltip(section: string) {
|
||||
switch (section) {
|
||||
case 'Modrinth Pride':
|
||||
return formatMessage(messages.modrinthPrideTooltip)
|
||||
default:
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
|
||||
function getDefaultSkinSectionSortIndex(section: string) {
|
||||
const index = DEFAULT_SKIN_SECTION_SORT_ORDER.indexOf(section)
|
||||
return index === -1 ? DEFAULT_SKIN_SECTION_SORT_ORDER.length : index
|
||||
}
|
||||
|
||||
function changeSkin(newSkin: Skin) {
|
||||
selectedSkin.value = newSkin
|
||||
}
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import {
|
||||
injectModrinthClient,
|
||||
injectModrinthServerContext,
|
||||
ServersManageAccessPage,
|
||||
} from '@modrinth/ui'
|
||||
import { useQueryClient } from '@tanstack/vue-query'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { serverId } = injectModrinthServerContext()
|
||||
const queryClient = useQueryClient()
|
||||
|
||||
try {
|
||||
await Promise.all([
|
||||
queryClient.ensureQueryData({
|
||||
queryKey: ['servers', 'users', 'v1', serverId],
|
||||
queryFn: () => client.archon.server_users_v1.list(serverId),
|
||||
staleTime: 30_000,
|
||||
}),
|
||||
queryClient.ensureQueryData({
|
||||
queryKey: ['servers', 'v1', 'detail', serverId],
|
||||
queryFn: () => client.archon.servers_v1.get(serverId),
|
||||
staleTime: 30_000,
|
||||
}),
|
||||
])
|
||||
} catch {
|
||||
// Let mounted layouts' useQuery surface errors; do not fail route setup.
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<ServersManageAccessPage />
|
||||
</template>
|
||||
@@ -1,8 +1,7 @@
|
||||
import Access from './Access.vue'
|
||||
import Backups from './Backups.vue'
|
||||
import Content from './Content.vue'
|
||||
import Files from './Files.vue'
|
||||
import Index from './Index.vue'
|
||||
import Overview from './Overview.vue'
|
||||
|
||||
export { Access, Backups, Content, Files, Index, Overview }
|
||||
export { Backups, Content, Files, Index, Overview }
|
||||
|
||||
@@ -32,16 +32,14 @@
|
||||
{{ instance.loader }} {{ instance.game_version }}
|
||||
</div>
|
||||
|
||||
<template v-if="showInstancePlayTime">
|
||||
<div class="w-1.5 h-1.5 rounded-full bg-surface-5"></div>
|
||||
<div class="w-1.5 h-1.5 rounded-full bg-surface-5"></div>
|
||||
|
||||
<div class="flex items-center gap-2 font-medium">
|
||||
<template v-if="timePlayed > 0">
|
||||
{{ timePlayedHumanized }}
|
||||
</template>
|
||||
<template v-else> Never played </template>
|
||||
</div>
|
||||
</template>
|
||||
<div class="flex items-center gap-2 font-medium">
|
||||
<template v-if="timePlayed > 0">
|
||||
{{ timePlayedHumanized }}
|
||||
</template>
|
||||
<template v-else> Never played </template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<template v-else>
|
||||
@@ -328,7 +326,7 @@ import { showProfileInFolder } from '@/helpers/utils.js'
|
||||
import { get_server_status, refreshWorlds } from '@/helpers/worlds'
|
||||
import { injectServerInstall } from '@/providers/server-install'
|
||||
import { handleSevereError } from '@/store/error.js'
|
||||
import { useBreadcrumbs, useTheming } from '@/store/state'
|
||||
import { useBreadcrumbs } from '@/store/state'
|
||||
|
||||
dayjs.extend(duration)
|
||||
dayjs.extend(relativeTime)
|
||||
@@ -340,8 +338,6 @@ const route = useRoute()
|
||||
|
||||
const router = useRouter()
|
||||
const breadcrumbs = useBreadcrumbs()
|
||||
const themeStore = useTheming()
|
||||
const showInstancePlayTime = computed(() => themeStore.getFeatureFlag('show_instance_play_time'))
|
||||
const contentSubpageRouteNames = new Set(['Mods', 'ModsFilter'])
|
||||
|
||||
const offline = ref(!navigator.onLine)
|
||||
|
||||
@@ -297,58 +297,6 @@ function isActiveUpdateRequest(requestId: number) {
|
||||
return activeUpdateRequestId.value === requestId
|
||||
}
|
||||
|
||||
function sortVersionsByPublishedDate(versions: Labrinth.Versions.v2.Version[]) {
|
||||
return [...versions].sort(
|
||||
(a, b) => new Date(b.date_published).getTime() - new Date(a.date_published).getTime(),
|
||||
)
|
||||
}
|
||||
|
||||
function mergeVersionIntoList(
|
||||
versions: Labrinth.Versions.v2.Version[],
|
||||
version: Labrinth.Versions.v2.Version,
|
||||
) {
|
||||
const existingIndex = versions.findIndex((v) => v.id === version.id)
|
||||
if (existingIndex === -1) {
|
||||
return sortVersionsByPublishedDate([version, ...versions])
|
||||
}
|
||||
|
||||
const mergedVersions = [...versions]
|
||||
mergedVersions[existingIndex] = version
|
||||
return sortVersionsByPublishedDate(mergedVersions)
|
||||
}
|
||||
|
||||
async function getUpdaterProjectVersions(projectId: string, pinnedVersionId?: string) {
|
||||
let fetchError: unknown = null
|
||||
let versions = (await get_project_versions(projectId, 'bypass').catch((err) => {
|
||||
fetchError = err
|
||||
return null
|
||||
})) as Labrinth.Versions.v2.Version[] | null
|
||||
|
||||
if (!versions) {
|
||||
versions = (await get_project_versions(projectId).catch(() => null)) as
|
||||
| Labrinth.Versions.v2.Version[]
|
||||
| null
|
||||
}
|
||||
|
||||
if (!versions && fetchError) {
|
||||
handleError(fetchError as Error)
|
||||
}
|
||||
|
||||
let mergedVersions = sortVersionsByPublishedDate(versions ?? [])
|
||||
|
||||
if (pinnedVersionId && !mergedVersions.some((version) => version.id === pinnedVersionId)) {
|
||||
const pinnedVersion = (await get_version(pinnedVersionId, 'bypass').catch(
|
||||
() => null,
|
||||
)) as Labrinth.Versions.v2.Version | null
|
||||
|
||||
if (pinnedVersion) {
|
||||
mergedVersions = mergeVersionIntoList(mergedVersions, pinnedVersion)
|
||||
}
|
||||
}
|
||||
|
||||
return mergedVersions
|
||||
}
|
||||
|
||||
async function handleBrowseContent() {
|
||||
if (!props.instance) return
|
||||
await router.push({
|
||||
@@ -595,14 +543,16 @@ async function handleUpdate(id: string) {
|
||||
})
|
||||
contentUpdaterModal.value?.show(initialVersionId)
|
||||
|
||||
const versions = await getUpdaterProjectVersions(item.project.id, initialVersionId)
|
||||
const versions = (await get_project_versions(item.project.id).catch((e) => {
|
||||
return handleError(e)
|
||||
})) as Labrinth.Versions.v2.Version[] | null
|
||||
|
||||
if (!isActiveUpdateRequest(requestId) || getContentItemId(updatingProject.value) !== itemId)
|
||||
return
|
||||
|
||||
loadingVersions.value = false
|
||||
|
||||
if (versions.length === 0) {
|
||||
if (!versions) {
|
||||
debug('handleUpdate: no versions returned', { projectId: item.project.id })
|
||||
return
|
||||
}
|
||||
@@ -621,6 +571,9 @@ async function handleUpdate(id: string) {
|
||||
updateVersionInList: versions.some((v) => v.id === item.update_version_id),
|
||||
})
|
||||
|
||||
versions.sort(
|
||||
(a, b) => new Date(b.date_published).getTime() - new Date(a.date_published).getTime(),
|
||||
)
|
||||
const preselectedVersion =
|
||||
versions.find((version) => version.id === initialVersionId) ?? versions[0] ?? null
|
||||
debug('handleUpdate: resolved content updater preselection', {
|
||||
@@ -658,16 +611,23 @@ async function handleSwitchVersion(item: ContentItem) {
|
||||
|
||||
await nextTick()
|
||||
|
||||
const initialVersionId = item.version.id
|
||||
contentUpdaterModal.value?.show(initialVersionId, { switchMode: true })
|
||||
contentUpdaterModal.value?.show(item.version.id, { switchMode: true })
|
||||
|
||||
const versions = await getUpdaterProjectVersions(item.project.id, initialVersionId)
|
||||
const versions = (await get_project_versions(item.project.id).catch((e) => {
|
||||
return handleError(e)
|
||||
})) as Labrinth.Versions.v2.Version[] | null
|
||||
|
||||
if (!isActiveUpdateRequest(requestId) || getContentItemId(updatingProject.value) !== itemId)
|
||||
return
|
||||
|
||||
loadingVersions.value = false
|
||||
|
||||
if (!versions) return
|
||||
|
||||
versions.sort(
|
||||
(a, b) => new Date(b.date_published).getTime() - new Date(a.date_published).getTime(),
|
||||
)
|
||||
|
||||
updatingProjectVersions.value = versions
|
||||
}
|
||||
|
||||
@@ -753,17 +713,19 @@ async function handleModpackUpdate() {
|
||||
})
|
||||
contentUpdaterModal.value?.show(initialVersionId)
|
||||
|
||||
const versions = await getUpdaterProjectVersions(
|
||||
props.instance.linked_data.project_id,
|
||||
initialVersionId,
|
||||
)
|
||||
const versions = (await get_project_versions(props.instance.linked_data.project_id).catch(
|
||||
handleError,
|
||||
)) as Labrinth.Versions.v2.Version[] | null
|
||||
|
||||
if (!isActiveUpdateRequest(requestId) || !updatingModpack.value) return
|
||||
|
||||
loadingVersions.value = false
|
||||
|
||||
if (versions.length === 0) return
|
||||
if (!versions) return
|
||||
|
||||
versions.sort(
|
||||
(a, b) => new Date(b.date_published).getTime() - new Date(a.date_published).getTime(),
|
||||
)
|
||||
const preselectedVersion =
|
||||
versions.find((version) => version.id === initialVersionId) ?? versions[0] ?? null
|
||||
debug('handleModpackUpdate: resolved modpack updater preselection', {
|
||||
@@ -798,7 +760,12 @@ async function fetchAndSpliceVersion(
|
||||
)) as Labrinth.Versions.v2.Version | null
|
||||
if (!isActiveUpdateRequest(requestId)) return
|
||||
if (!fullVersion) return
|
||||
updatingProjectVersions.value = mergeVersionIntoList(updatingProjectVersions.value, fullVersion)
|
||||
const index = updatingProjectVersions.value.findIndex((v) => v.id === versionId)
|
||||
if (index !== -1) {
|
||||
const newVersions = [...updatingProjectVersions.value]
|
||||
newVersions[index] = fullVersion
|
||||
updatingProjectVersions.value = newVersions
|
||||
}
|
||||
}
|
||||
|
||||
async function handleVersionSelect(version: Labrinth.Versions.v2.Version) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { Labrinth } from '@modrinth/api-client'
|
||||
import { type AuthProvider, type AuthUser, provideAuth } from '@modrinth/ui'
|
||||
import { type AuthProvider, provideAuth } from '@modrinth/ui'
|
||||
import { computed, type Ref, ref, watchEffect } from 'vue'
|
||||
|
||||
type AppCredentials = {
|
||||
@@ -12,7 +12,7 @@ export function setupAuthProvider(
|
||||
requestSignIn: (redirectPath: string) => void | Promise<void>,
|
||||
) {
|
||||
const sessionToken = ref<string | null>(null)
|
||||
const user = ref<AuthUser | null>(null)
|
||||
const user = ref<Labrinth.Users.v2.User | null>(null)
|
||||
const isReady = computed(() => credentials.value !== undefined)
|
||||
|
||||
const authProvider: AuthProvider = {
|
||||
|
||||
@@ -26,7 +26,7 @@ export function setupFilePickerProvider() {
|
||||
const file = await createFileFromPath(path, 'icon')
|
||||
return { file, path, previewUrl: convertFileSrc(path) }
|
||||
},
|
||||
async pickModpackFile(options) {
|
||||
async pickModpackFile() {
|
||||
const result = await open({
|
||||
multiple: false,
|
||||
filters: [{ name: 'Modpack', extensions: ['mrpack'] }],
|
||||
@@ -34,19 +34,12 @@ export function setupFilePickerProvider() {
|
||||
if (!result) return null
|
||||
const path = result.path ?? result
|
||||
if (!path) return null
|
||||
if (options?.readFile === false) {
|
||||
// Instance imports stream from the native path, keeping large packs out of JS memory.
|
||||
return { path, previewUrl: '' }
|
||||
}
|
||||
return {
|
||||
file: await createFileFromPath(
|
||||
path,
|
||||
'modpack.mrpack',
|
||||
'application/x-modrinth-modpack+zip',
|
||||
),
|
||||
const file = await createFileFromPath(
|
||||
path,
|
||||
previewUrl: '',
|
||||
}
|
||||
'modpack.mrpack',
|
||||
'application/x-modrinth-modpack+zip',
|
||||
)
|
||||
return { file, path, previewUrl: '' }
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@@ -73,14 +73,6 @@ export default new createRouter({
|
||||
breadcrumb: [{ name: '?Server' }],
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'access',
|
||||
name: 'ServerManageAccess',
|
||||
component: Hosting.Access,
|
||||
meta: {
|
||||
breadcrumb: [{ name: '?Server' }],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
||||
@@ -9,9 +9,7 @@ export const DEFAULT_FEATURE_FLAGS = {
|
||||
server_ram_as_bytes_always_on: false,
|
||||
always_show_app_controls: false,
|
||||
skip_unknown_pack_warning: false,
|
||||
pride_fundraiser: true,
|
||||
i18n_debug: false,
|
||||
show_instance_play_time: true,
|
||||
}
|
||||
|
||||
export const THEME_OPTIONS = ['dark', 'light', 'oled', 'system'] as const
|
||||
|
||||
@@ -58,9 +58,6 @@ export default defineConfig({
|
||||
params: {
|
||||
overrides: {
|
||||
removeViewBox: false,
|
||||
cleanupIds: {
|
||||
minify: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -42,12 +42,6 @@
|
||||
{
|
||||
"url": "https://api.purpurmc.org/*"
|
||||
},
|
||||
{
|
||||
"url": "http://localhost:8000/*"
|
||||
},
|
||||
{
|
||||
"url": "http://127.0.0.1:8000/*"
|
||||
},
|
||||
{
|
||||
"url": "http://*.taila228c5.ts.net/*"
|
||||
},
|
||||
|
||||
@@ -40,3 +40,4 @@ These composables are deprecated and should not be used in new code:
|
||||
|
||||
- **`useAsyncData`** - we use tanstack, not nuxt's built in async data utility.
|
||||
- **`useBaseFetch`** (`src/composables/fetch.js`) — legacy Labrinth fetch wrapper. Use `client.labrinth.*` modules instead.
|
||||
- **`useServersFetch`** (`src/composables/servers/servers-fetch.ts`) — legacy Archon fetch wrapper with manual retry/circuit-breaker. Use `client.archon.*` modules instead — refer to the `packages/api-client/CLAUDE.md` for more information.
|
||||
|
||||
@@ -75,10 +75,10 @@ export default defineNuxtConfig({
|
||||
},
|
||||
ssr: {
|
||||
// https://github.com/Akryum/floating-vue/issues/809#issuecomment-1002996240
|
||||
noExternal: ['floating-vue', '@floating-ui/core', '@floating-ui/dom'],
|
||||
},
|
||||
optimizeDeps: {
|
||||
include: ['vue-router', 'floating-vue', '@floating-ui/dom'],
|
||||
noExternal: ['v-tooltip'],
|
||||
optimizeDeps: {
|
||||
include: ['vue-router'],
|
||||
},
|
||||
},
|
||||
define: {
|
||||
global: {},
|
||||
@@ -104,9 +104,6 @@ export default defineNuxtConfig({
|
||||
params: {
|
||||
overrides: {
|
||||
removeViewBox: false,
|
||||
cleanupIds: {
|
||||
minify: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -224,7 +221,6 @@ export default defineNuxtConfig({
|
||||
globalThis.INTERCOM_APP_ID ||
|
||||
'ykeritl9',
|
||||
production: isProduction(),
|
||||
cookieSecure: isProduction(),
|
||||
buildEnv: process.env.BUILD_ENV,
|
||||
preview: process.env.PREVIEW === 'true',
|
||||
featureFlagOverrides: getFeatureFlagOverrides(),
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
"@types/semver": "^7.7.1",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"glob": "^10.2.7",
|
||||
"nuxt": "=3.20.2",
|
||||
"nuxt": "^3.20.2",
|
||||
"postcss": "^8.4.39",
|
||||
"prettier-plugin-tailwindcss": "^0.6.5",
|
||||
"sass": "^1.58.0",
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
/*
|
||||
Cards and body styling
|
||||
*/
|
||||
// CARDS
|
||||
.base-card {
|
||||
padding: 1rem;
|
||||
padding: var(--spacing-card-lg);
|
||||
position: relative;
|
||||
min-height: var(--font-size-2xl);
|
||||
|
||||
background-color: var(--surface-3);
|
||||
border-radius: var(--radius-lg);
|
||||
border: 1px solid var(--surface-4);
|
||||
background-color: var(--color-raised-bg);
|
||||
border-radius: var(--size-rounded-card);
|
||||
|
||||
margin-bottom: var(--gap-md);
|
||||
margin-bottom: var(--spacing-card-md);
|
||||
outline: 2px solid transparent;
|
||||
outline-offset: -2px;
|
||||
|
||||
box-shadow: var(--shadow-card);
|
||||
|
||||
.card__overlay {
|
||||
position: absolute;
|
||||
@@ -25,17 +25,6 @@
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
&:where(&.warning, &.information) {
|
||||
padding: 1.5rem;
|
||||
line-height: 1.5;
|
||||
min-height: 0;
|
||||
|
||||
a {
|
||||
color: var(--color-blue);
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
&.moderation-card {
|
||||
background-color: var(--color-warning-banner-bg);
|
||||
}
|
||||
|
||||
+2
-2
@@ -10,7 +10,7 @@
|
||||
>
|
||||
<div
|
||||
v-if="showLegendTopFade"
|
||||
class="z-1 pointer-events-none absolute left-0 right-0 top-0 h-5 bg-gradient-to-b from-surface-3 to-transparent"
|
||||
class="pointer-events-none absolute left-0 right-0 top-0 z-10 h-5 bg-gradient-to-b from-surface-3 to-transparent"
|
||||
/>
|
||||
</Transition>
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
>
|
||||
<div
|
||||
v-if="showLegendBottomFade"
|
||||
class="z-1 pointer-events-none absolute bottom-0 left-0 right-0 h-5 bg-gradient-to-t from-surface-3 to-transparent"
|
||||
class="pointer-events-none absolute bottom-0 left-0 right-0 z-10 h-5 bg-gradient-to-t from-surface-3 to-transparent"
|
||||
/>
|
||||
</Transition>
|
||||
</div>
|
||||
|
||||
+1
-1
@@ -132,7 +132,7 @@
|
||||
:href="event.announcement_url"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
class="my-0.5 inline-flex items-center gap-1 text-xs font-medium text-primary underline !transition-all hover:text-contrast"
|
||||
class="mt-1.5 inline-flex items-center gap-1 text-sm font-medium text-primary underline !transition-all hover:text-contrast"
|
||||
>
|
||||
{{ formatMessage(analyticsChartMessages.seeAnnouncement) }}
|
||||
<ExternalIcon class="size-3.5" aria-hidden="true" />
|
||||
|
||||
+7
-8
@@ -18,7 +18,7 @@
|
||||
({{ durationLabel }})
|
||||
</span>
|
||||
</span>
|
||||
<span v-if="previousRangeLabel" class="min-w-0 space-x-1 truncate text-xs text-primary">
|
||||
<span v-if="previousRangeLabel" class="min-w-0 truncate text-xs text-primary">
|
||||
<span class="font-medium">{{ previousRangeLabel }}</span>
|
||||
<span class="font-normal text-secondary">
|
||||
{{ formatMessage(analyticsChartMessages.previousPeriodShort) }}
|
||||
@@ -197,7 +197,6 @@ function getEntryAriaLabel(entry: AnalyticsChartTooltipEntry) {
|
||||
const ONE_DAY_MS = 24 * 60 * 60 * 1000
|
||||
const ONE_HOUR_MS = 60 * 60 * 1000
|
||||
const ONE_MINUTE_MS = 60 * 1000
|
||||
const DATE_LOCALE = 'en-US'
|
||||
|
||||
function formatRangeLabel(
|
||||
start: Date,
|
||||
@@ -226,13 +225,13 @@ function formatRangeLabel(
|
||||
}
|
||||
|
||||
if (includeTime) {
|
||||
const startLabel = new Intl.DateTimeFormat(DATE_LOCALE, startOptions).format(start)
|
||||
const endLabel = new Intl.DateTimeFormat(DATE_LOCALE, timeOptions).format(end)
|
||||
const startLabel = new Intl.DateTimeFormat(undefined, startOptions).format(start)
|
||||
const endLabel = new Intl.DateTimeFormat(undefined, timeOptions).format(end)
|
||||
const range = `${startLabel}–${endLabel}`
|
||||
|
||||
if (!showTrailingYear) return range
|
||||
|
||||
const yearLabel = new Intl.DateTimeFormat(DATE_LOCALE, { year: 'numeric' }).format(end)
|
||||
const yearLabel = new Intl.DateTimeFormat(undefined, { year: 'numeric' }).format(end)
|
||||
return `${range}, ${yearLabel}`
|
||||
}
|
||||
|
||||
@@ -245,13 +244,13 @@ function formatRangeLabel(
|
||||
endOptions = { day: 'numeric' }
|
||||
}
|
||||
|
||||
const startLabel = new Intl.DateTimeFormat(DATE_LOCALE, startOptions).format(start)
|
||||
const endLabel = new Intl.DateTimeFormat(DATE_LOCALE, endOptions).format(end)
|
||||
const startLabel = new Intl.DateTimeFormat(undefined, startOptions).format(start)
|
||||
const endLabel = new Intl.DateTimeFormat(undefined, endOptions).format(end)
|
||||
const range = `${startLabel}–${endLabel}`
|
||||
|
||||
if (!showTrailingYear) return range
|
||||
|
||||
const yearLabel = new Intl.DateTimeFormat(DATE_LOCALE, { year: 'numeric' }).format(end)
|
||||
const yearLabel = new Intl.DateTimeFormat(undefined, { year: 'numeric' }).format(end)
|
||||
return `${range}, ${yearLabel}`
|
||||
}
|
||||
|
||||
|
||||
+1
@@ -40,6 +40,7 @@ export function useAnalyticsChartEvents(
|
||||
placeholderData: [],
|
||||
refetchOnMount: 'always',
|
||||
retry: false,
|
||||
staleTime: 0,
|
||||
})
|
||||
|
||||
const localAnalyticsChartEvents = computed(() => analyticsEvents.value ?? [])
|
||||
|
||||
+4
-11
@@ -109,7 +109,7 @@ function getRegionDisplayNames(locale: string): Intl.DisplayNames | null {
|
||||
function formatCountryCode(countryCode: string, formatMessage: FormatMessage): string {
|
||||
const normalized = countryCode.trim().toUpperCase()
|
||||
if (normalized === OTHER_COUNTRY_CODE) {
|
||||
return formatMessage(analyticsMessages.other)
|
||||
return formatMessage(analyticsMessages.unknown)
|
||||
}
|
||||
|
||||
if (!REGION_CODE_PATTERN.test(normalized)) {
|
||||
@@ -146,9 +146,6 @@ export function formatBreakdownLabel(
|
||||
normalizedLowercaseValue === 'other' ||
|
||||
normalizedLowercaseValue === 'unknown'
|
||||
) {
|
||||
if (selectedBreakdown === 'country') {
|
||||
return formatMessage(analyticsMessages.other)
|
||||
}
|
||||
return formatMessage(analyticsMessages.unknown)
|
||||
}
|
||||
if (selectedBreakdown === 'country') {
|
||||
@@ -756,7 +753,7 @@ export function formatMetricValue(
|
||||
case 'playtime': {
|
||||
const hours = value / 3600
|
||||
return formatMessage(analyticsStatCardMessages.playtimeHours, {
|
||||
hours: Math.abs(hours) < 1 ? hours.toFixed(2) : hours.toFixed(1),
|
||||
hours: hours.toFixed(1),
|
||||
})
|
||||
}
|
||||
case 'views':
|
||||
@@ -773,11 +770,7 @@ function formatSmallAxisNumber(value: number): string {
|
||||
}
|
||||
|
||||
const formattedValue = Math.abs(value) < 1 ? value.toFixed(2) : value.toFixed(1)
|
||||
return trimTrailingFractionZeros(formattedValue)
|
||||
}
|
||||
|
||||
function trimTrailingFractionZeros(value: string): string {
|
||||
return value.replace(/(\.\d*?)0+$/, '$1').replace(/\.$/, '')
|
||||
return formattedValue.replace(/\.?0+$/, '')
|
||||
}
|
||||
|
||||
const COMPACT_AXIS_UNITS = [
|
||||
@@ -821,7 +814,7 @@ function formatCompactAxisValue(value: number): string {
|
||||
return String(truncatedValue)
|
||||
}
|
||||
|
||||
return trimTrailingFractionZeros(roundedValue.toFixed(fractionDigitCount))
|
||||
return roundedValue.toFixed(fractionDigitCount).replace(/\.?0+$/, '')
|
||||
}
|
||||
|
||||
export function formatAxisValue(
|
||||
|
||||
+1
-1
@@ -96,7 +96,7 @@ export function useAnalyticsChartDatasets(
|
||||
}
|
||||
|
||||
return hasAvailableProjects.value
|
||||
? formatMessage(analyticsMessages.noDataAvailable)
|
||||
? formatMessage(analyticsMessages.selectAtLeastOneProject)
|
||||
: formatMessage(analyticsMessages.noProjectsAvailableForAnalytics)
|
||||
})
|
||||
const legendPalette = computed(() =>
|
||||
|
||||
@@ -224,19 +224,6 @@ export const analyticsGraphTitleMessages = defineMessages({
|
||||
})
|
||||
|
||||
export const analyticsStatCardMessages = defineMessages({
|
||||
monetizationBannerTitle: {
|
||||
id: 'analytics.stat.monetization-banner.title',
|
||||
defaultMessage: 'How does monetization work?',
|
||||
},
|
||||
monetizationBannerBody: {
|
||||
id: 'analytics.stat.monetization-banner.body',
|
||||
defaultMessage:
|
||||
'Only views and downloads made through Modrinth are eligible for monetization and must pass fraud-prevention filtering. Modrinth App downloads also require the user to be logged in. Because all projects have a similar ratio of monetized downloads, your revenue would not meaningfully change if all downloads were counted.',
|
||||
},
|
||||
monetizationBannerLearnMore: {
|
||||
id: 'analytics.stat.monetization-banner.learn-more',
|
||||
defaultMessage: 'Learn more',
|
||||
},
|
||||
revenueValue: {
|
||||
id: 'analytics.stat.revenue-value',
|
||||
defaultMessage: '${value}',
|
||||
|
||||
-2
@@ -66,7 +66,6 @@ export function buildAnalyticsTableColumns({
|
||||
key: getAnalyticsTableBreakdownColumnKey(breakdown),
|
||||
label: getAnalyticsTableBreakdownColumnLabel(breakdown, formatMessage),
|
||||
enableSorting: true,
|
||||
width: breakdown === 'project' ? '25%' : undefined,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -76,7 +75,6 @@ export function buildAnalyticsTableColumns({
|
||||
key: 'project',
|
||||
label: formatAnalyticsBreakdownLabel('project', formatMessage),
|
||||
enableSorting: true,
|
||||
width: '25%',
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
+3
-5
@@ -40,12 +40,10 @@ export function formatAnalyticsTableCompactPlaytime(
|
||||
formatMessage: FormatMessage,
|
||||
): string {
|
||||
const totalSeconds = Math.max(0, Math.round(value))
|
||||
const hours = totalSeconds / SECONDS_PER_HOUR
|
||||
const fractionDigits = hours < 1 ? 2 : 1
|
||||
return formatMessage(analyticsStatCardMessages.playtimeHours, {
|
||||
hours: hours.toLocaleString(undefined, {
|
||||
minimumFractionDigits: fractionDigits,
|
||||
maximumFractionDigits: fractionDigits,
|
||||
hours: (totalSeconds / SECONDS_PER_HOUR).toLocaleString(undefined, {
|
||||
minimumFractionDigits: 1,
|
||||
maximumFractionDigits: 1,
|
||||
}),
|
||||
})
|
||||
}
|
||||
|
||||
+1
-17
@@ -12,7 +12,6 @@ import {
|
||||
getSliceCount,
|
||||
} from '../analytics-chart/analytics-chart-utils'
|
||||
import type { FormatMessage } from '../analytics-messages'
|
||||
import { analyticsMessages } from '../analytics-messages'
|
||||
import {
|
||||
ALL_BREAKDOWN_VALUE,
|
||||
COMBINED_BREAKDOWN_LABEL_SEPARATOR,
|
||||
@@ -65,8 +64,6 @@ export function buildAnalyticsTableRows({
|
||||
|
||||
const timeRange = fetchRequest.time_range
|
||||
const sliceCount = getSliceCount(timeRange, timeSlices.length)
|
||||
const currentTimeSlices =
|
||||
timeSlices.length > sliceCount ? timeSlices.slice(timeSlices.length - sliceCount) : timeSlices
|
||||
const includeDate = mode === 'date_breakdown'
|
||||
const breakdownDisplayValues = new Map<string, string>()
|
||||
const projectDisplayValues = new Map<string, string>()
|
||||
@@ -122,22 +119,9 @@ export function buildAnalyticsTableRows({
|
||||
}
|
||||
|
||||
function getCombinedBreakdownDisplay(displays: AnalyticsTableBreakdownDisplayValues) {
|
||||
const unknownBreakdownLabel = formatMessage(analyticsMessages.unknown)
|
||||
let hasUnknownBreakdownLabel = false
|
||||
|
||||
return selectedBreakdowns
|
||||
.map((breakdown) => displays[breakdown])
|
||||
.filter((displayValue): displayValue is string => Boolean(displayValue))
|
||||
.filter((displayValue) => {
|
||||
if (displayValue !== unknownBreakdownLabel) {
|
||||
return true
|
||||
}
|
||||
if (hasUnknownBreakdownLabel) {
|
||||
return false
|
||||
}
|
||||
hasUnknownBreakdownLabel = true
|
||||
return true
|
||||
})
|
||||
.join(COMBINED_BREAKDOWN_LABEL_SEPARATOR)
|
||||
}
|
||||
|
||||
@@ -200,7 +184,7 @@ export function buildAnalyticsTableRows({
|
||||
}
|
||||
}
|
||||
|
||||
currentTimeSlices.forEach((slice, sliceIndex) => {
|
||||
timeSlices.forEach((slice, sliceIndex) => {
|
||||
const bucketLabel = includeDate ? getBucketLabel(sliceIndex) : undefined
|
||||
|
||||
for (const point of slice) {
|
||||
|
||||
@@ -30,10 +30,9 @@ export function getAnalyticsBreakdownValue(
|
||||
case 'user_agent': {
|
||||
const downloadSource = normalizeBreakdownValue(
|
||||
'user_agent' in point ? point.user_agent : undefined,
|
||||
UNKNOWN_BREAKDOWN_VALUE,
|
||||
)
|
||||
return downloadSource === UNKNOWN_BREAKDOWN_VALUE
|
||||
? UNKNOWN_BREAKDOWN_VALUE
|
||||
return downloadSource === ALL_BREAKDOWN_VALUE
|
||||
? ALL_BREAKDOWN_VALUE
|
||||
: getDownloadSourceLabel(downloadSource, formatMessage)
|
||||
}
|
||||
case 'download_reason':
|
||||
@@ -99,12 +98,5 @@ function normalizeBreakdownValue(
|
||||
fallback = ALL_BREAKDOWN_VALUE,
|
||||
): string {
|
||||
const normalized = value?.trim()
|
||||
const normalizedLowercase = normalized?.toLowerCase()
|
||||
if (
|
||||
fallback === UNKNOWN_BREAKDOWN_VALUE &&
|
||||
(normalizedLowercase === 'unknown' || normalizedLowercase === 'other')
|
||||
) {
|
||||
return fallback
|
||||
}
|
||||
return normalized && normalized.length > 0 ? normalized : fallback
|
||||
}
|
||||
|
||||
@@ -232,13 +232,7 @@ import {
|
||||
type AnalyticsFilterValueCategory = Exclude<AnalyticsQueryFilterCategory, 'project'>
|
||||
type GameVersionType = 'release' | 'all'
|
||||
type SetDropdownFilterValues = (values: string[]) => void
|
||||
type DownloadsThresholdSelection = {
|
||||
categoryKey: DownloadsThresholdFilterCategory
|
||||
selectedValues: string[]
|
||||
}
|
||||
type ApplyDownloadsThreshold = (
|
||||
setSelectedValues: SetDropdownFilterValues,
|
||||
) => DownloadsThresholdSelection | null
|
||||
type ApplyDownloadsThreshold = (setSelectedValues: SetDropdownFilterValues) => void
|
||||
type CloseDownloadsThresholdMenu = (event?: Event) => void
|
||||
|
||||
const props = withDefaults(
|
||||
@@ -769,46 +763,48 @@ function compareOptionalDateStringsDescending(
|
||||
function applyGameVersionDownloadsThreshold(setSelectedValues: SetDropdownFilterValues) {
|
||||
const threshold = gameVersionDownloadsThreshold.value
|
||||
if (threshold === null) {
|
||||
return null
|
||||
return
|
||||
}
|
||||
|
||||
const selectedValues = gameVersionFilterOptions.value
|
||||
.filter((gameVersion) => {
|
||||
return (gameVersionDownloadsByVersion.value.get(gameVersion.value) ?? 0) > threshold
|
||||
return (gameVersionDownloadsByVersion.value.get(gameVersion.value) ?? 0) >= threshold
|
||||
})
|
||||
.map((gameVersion) => gameVersion.value)
|
||||
|
||||
return setDownloadsThresholdSelectedValues('game_version', selectedValues, setSelectedValues)
|
||||
setDownloadsThresholdSelectedValues('game_version', selectedValues, setSelectedValues)
|
||||
}
|
||||
|
||||
function applyCountryDownloadsThreshold(setSelectedValues: SetDropdownFilterValues) {
|
||||
const threshold = countryDownloadsThreshold.value
|
||||
if (threshold === null) {
|
||||
return null
|
||||
return
|
||||
}
|
||||
|
||||
const selectedValues = countryFilterOptions.value
|
||||
.filter((country) => {
|
||||
return (countryDownloadsByCode.value.get(country.value.trim().toUpperCase()) ?? 0) > threshold
|
||||
return (
|
||||
(countryDownloadsByCode.value.get(country.value.trim().toUpperCase()) ?? 0) >= threshold
|
||||
)
|
||||
})
|
||||
.map((country) => country.value)
|
||||
|
||||
return setDownloadsThresholdSelectedValues('country', selectedValues, setSelectedValues)
|
||||
setDownloadsThresholdSelectedValues('country', selectedValues, setSelectedValues)
|
||||
}
|
||||
|
||||
function applyProjectVersionDownloadsThreshold(setSelectedValues: SetDropdownFilterValues) {
|
||||
const threshold = projectVersionDownloadsThreshold.value
|
||||
if (threshold === null) {
|
||||
return null
|
||||
return
|
||||
}
|
||||
|
||||
const selectedValues = projectVersionFilterOptions.value
|
||||
.filter((version) => {
|
||||
return (projectVersionDownloadsById.value.get(version.value) ?? 0) > threshold
|
||||
return (projectVersionDownloadsById.value.get(version.value) ?? 0) >= threshold
|
||||
})
|
||||
.map((version) => version.value)
|
||||
|
||||
return setDownloadsThresholdSelectedValues('version_id', selectedValues, setSelectedValues)
|
||||
setDownloadsThresholdSelectedValues('version_id', selectedValues, setSelectedValues)
|
||||
}
|
||||
|
||||
function setCountryDownloadsThreshold(
|
||||
@@ -880,18 +876,12 @@ function setDownloadsThresholdSelectedValues(
|
||||
categoryKey: DownloadsThresholdFilterCategory,
|
||||
selectedValues: string[],
|
||||
setSelectedValues: SetDropdownFilterValues,
|
||||
): DownloadsThresholdSelection {
|
||||
const normalizedSelectedValues = normalizeSelectedFilterValues(categoryKey, selectedValues, [])
|
||||
) {
|
||||
downloadsThresholdSelections.value = {
|
||||
...downloadsThresholdSelections.value,
|
||||
[categoryKey]: normalizedSelectedValues,
|
||||
[categoryKey]: normalizeSelectedFilterValues(categoryKey, selectedValues, []),
|
||||
}
|
||||
setSelectedValues(selectedValues)
|
||||
|
||||
return {
|
||||
categoryKey,
|
||||
selectedValues: normalizedSelectedValues,
|
||||
}
|
||||
}
|
||||
|
||||
function clearDownloadsThreshold(categoryKey: DownloadsThresholdFilterCategory) {
|
||||
@@ -933,13 +923,8 @@ async function runDownloadsThresholdQuery(
|
||||
closeMenu: CloseDownloadsThresholdMenu,
|
||||
event?: KeyboardEvent,
|
||||
) {
|
||||
const selection = applyDownloadsThreshold(setSelectedValues)
|
||||
applyDownloadsThreshold(setSelectedValues)
|
||||
closeMenu(event)
|
||||
if (selection) {
|
||||
const nextFilters = cloneSelectedFilters(draftSelectedFilters.value)
|
||||
nextFilters[selection.categoryKey] = selection.selectedValues
|
||||
draftSelectedFilters.value = nextFilters
|
||||
}
|
||||
await scheduleSelectedFiltersCommit()
|
||||
await refreshAnalyticsQuery()
|
||||
}
|
||||
|
||||
@@ -52,7 +52,6 @@ const {
|
||||
selectedCustomTimeframeEndDate,
|
||||
selectedGroupBy,
|
||||
queryRefreshTimestamp,
|
||||
analyticsAllTimeStartDate,
|
||||
refreshAnalyticsQuery,
|
||||
} = injectAnalyticsDashboardContext()
|
||||
|
||||
@@ -108,7 +107,6 @@ function handleTimeframeDraftChange(selection: TimeFramePickerSelection) {
|
||||
customStartDate: selection.customStartDate,
|
||||
customEndDate: selection.customEndDate,
|
||||
nowTimestamp: queryRefreshTimestamp.value,
|
||||
allTimeStartDate: analyticsAllTimeStartDate.value,
|
||||
})
|
||||
const { start, end } = ensureMinimumTimeRange(range.start, range.end)
|
||||
const durationMinutes = Math.max(1, Math.floor((end.getTime() - start.getTime()) / 60000))
|
||||
|
||||
@@ -753,7 +753,7 @@ function applyProjectDownloadsThreshold(threshold: number | null) {
|
||||
}
|
||||
|
||||
const projectIds = projects.value
|
||||
.filter((project) => (projectDownloadsById.value.get(project.id) ?? 0) > threshold)
|
||||
.filter((project) => (projectDownloadsById.value.get(project.id) ?? 0) >= threshold)
|
||||
.map((project) => project.id)
|
||||
|
||||
projectDownloadsThresholdProjectIds.value = projectIds
|
||||
@@ -894,6 +894,12 @@ function isRevenueHourlyGroupBy(groupBy: AnalyticsGroupByPreset): boolean {
|
||||
return groupBy === '1h' || groupBy === '6h'
|
||||
}
|
||||
|
||||
function getAllTimeYearGroupStart(end: Date): Date {
|
||||
const start = new Date(end)
|
||||
start.setFullYear(2021)
|
||||
return start
|
||||
}
|
||||
|
||||
const groupByOptions = computed<ComboboxOption<AnalyticsGroupByPreset>[]>(() => {
|
||||
const timeframeMinutes = selectedTimeframeDurationMinutes.value
|
||||
const options = groupByPresetOptions.map((option) => {
|
||||
@@ -1153,7 +1159,13 @@ function buildMetricFilters(
|
||||
|
||||
const fetchRequest = computed<Labrinth.Analytics.v3.FetchRequest>(() => {
|
||||
const rawRange = selectedTimeRange.value
|
||||
const { start, end } = ensureMinimumTimeRange(rawRange.start, rawRange.end)
|
||||
const rawStart =
|
||||
selectedTimeframeMode.value === 'preset' &&
|
||||
selectedTimeframe.value === 'all_time' &&
|
||||
selectedGroupBy.value === 'year'
|
||||
? getAllTimeYearGroupStart(rawRange.end)
|
||||
: rawRange.start
|
||||
const { start, end } = ensureMinimumTimeRange(rawStart, rawRange.end)
|
||||
|
||||
const groupByMs = getAnalyticsGroupByPresetMinutes(selectedGroupBy.value) * 60 * 1000
|
||||
const desiredSlices = Math.max(1, Math.floor((end.getTime() - start.getTime()) / groupByMs))
|
||||
|
||||
@@ -84,7 +84,6 @@ function subtractCalendarMonths(date: Date, months: number): Date {
|
||||
export function getTimeRangeForPreset(
|
||||
preset: AnalyticsTimeframePreset,
|
||||
nowTimestamp: number,
|
||||
allTimeStartDate: Date = new Date(Date.UTC(2023, 0, 1, 0, 0, 0, 0)),
|
||||
): AnalyticsTimeRange {
|
||||
const now = getRoundedNow(nowTimestamp)
|
||||
const end = new Date(now)
|
||||
@@ -131,7 +130,7 @@ export function getTimeRangeForPreset(
|
||||
}
|
||||
case 'all_time':
|
||||
return {
|
||||
start: new Date(allTimeStartDate),
|
||||
start: new Date(Date.UTC(2023, 0, 1, 0, 0, 0, 0)),
|
||||
end,
|
||||
}
|
||||
default:
|
||||
@@ -194,7 +193,6 @@ export function getAnalyticsTimeRange({
|
||||
customStartDate,
|
||||
customEndDate,
|
||||
nowTimestamp,
|
||||
allTimeStartDate,
|
||||
}: {
|
||||
mode: AnalyticsTimeframeMode
|
||||
preset: AnalyticsTimeframePreset
|
||||
@@ -203,7 +201,6 @@ export function getAnalyticsTimeRange({
|
||||
customStartDate: string
|
||||
customEndDate: string
|
||||
nowTimestamp: number
|
||||
allTimeStartDate?: Date
|
||||
}): AnalyticsTimeRange {
|
||||
switch (mode) {
|
||||
case 'last':
|
||||
@@ -214,7 +211,7 @@ export function getAnalyticsTimeRange({
|
||||
return getTimeRangeForCustomDateTimeRange(customStartDate, customEndDate)
|
||||
case 'preset':
|
||||
default:
|
||||
return getTimeRangeForPreset(preset, nowTimestamp, allTimeStartDate)
|
||||
return getTimeRangeForPreset(preset, nowTimestamp)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -272,7 +269,6 @@ export function useSelectedAnalyticsTimeRange() {
|
||||
selectedCustomTimeframeStartDate,
|
||||
selectedCustomTimeframeEndDate,
|
||||
queryRefreshTimestamp,
|
||||
analyticsAllTimeStartDate,
|
||||
} = injectAnalyticsDashboardContext()
|
||||
|
||||
const selectedTimeRange = computed(() =>
|
||||
@@ -284,7 +280,6 @@ export function useSelectedAnalyticsTimeRange() {
|
||||
customStartDate: selectedCustomTimeframeStartDate.value,
|
||||
customEndDate: selectedCustomTimeframeEndDate.value,
|
||||
nowTimestamp: queryRefreshTimestamp.value,
|
||||
allTimeStartDate: analyticsAllTimeStartDate.value,
|
||||
}),
|
||||
)
|
||||
|
||||
|
||||
@@ -1,45 +1,21 @@
|
||||
<template>
|
||||
<div class="flex w-full flex-col gap-3">
|
||||
<Admonition
|
||||
v-if="showMonetizationBanner"
|
||||
type="info"
|
||||
:header="formatMessage(analyticsStatCardMessages.monetizationBannerTitle)"
|
||||
show-actions-underneath
|
||||
dismissible
|
||||
@dismiss="dismissMonetizationBanner"
|
||||
>
|
||||
<div class="text-primary">
|
||||
{{ formatMessage(analyticsStatCardMessages.monetizationBannerBody) }}
|
||||
</div>
|
||||
<template #actions>
|
||||
<ButtonStyled color="blue">
|
||||
<a href="https://modrinth.com/legal/cmp-info" target="_blank" class="w-fit !px-4">
|
||||
{{ formatMessage(analyticsStatCardMessages.monetizationBannerLearnMore) }}
|
||||
<RightArrowIcon aria-hidden="true" />
|
||||
</a>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
</Admonition>
|
||||
<div class="grid grid-cols-2 gap-3 lg:grid-cols-4">
|
||||
<StatCard
|
||||
v-for="card in statCards"
|
||||
:key="card.key"
|
||||
:label="card.label"
|
||||
:stat-label="card.statLabel"
|
||||
:vs-prev-period-percent="card.vsPrevPeriodPercent"
|
||||
:icon="card.icon"
|
||||
:active="activeStat === card.key"
|
||||
:disabled="card.disabled"
|
||||
@click="setActiveStat(card.key)"
|
||||
/>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-3 lg:grid-cols-4">
|
||||
<StatCard
|
||||
v-for="card in statCards"
|
||||
:key="card.key"
|
||||
:label="card.label"
|
||||
:stat-label="card.statLabel"
|
||||
:vs-prev-period-percent="card.vsPrevPeriodPercent"
|
||||
:icon="card.icon"
|
||||
:active="activeStat === card.key"
|
||||
:disabled="card.disabled"
|
||||
@click="setActiveStat(card.key)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { RightArrowIcon } from '@modrinth/assets'
|
||||
import { Admonition, ButtonStyled, useFormatNumber, useVIntl } from '@modrinth/ui'
|
||||
import { useLocalStorage } from '@vueuse/core'
|
||||
import { useFormatNumber, useVIntl } from '@modrinth/ui'
|
||||
|
||||
import {
|
||||
type AnalyticsDashboardStat,
|
||||
@@ -49,13 +25,10 @@ import {
|
||||
import { analyticsStatCardMessages, formatAnalyticsStatLabel } from '../analytics-messages.ts'
|
||||
import StatCard from './StatCard.vue'
|
||||
|
||||
const MONETIZATION_BANNER_DISMISSED_KEY = 'analytics-monetization-banner-dismissed'
|
||||
|
||||
const {
|
||||
activeStat,
|
||||
setActiveStat,
|
||||
currentTotals,
|
||||
previousTotals,
|
||||
percentChanges,
|
||||
hasPreviousPeriodComparison,
|
||||
selectedBreakdowns,
|
||||
@@ -63,11 +36,6 @@ const {
|
||||
} = injectAnalyticsDashboardContext()
|
||||
const formatNumber = useFormatNumber()
|
||||
const { formatMessage } = useVIntl()
|
||||
const monetizationBannerDismissed = useLocalStorage(MONETIZATION_BANNER_DISMISSED_KEY, false)
|
||||
const showMonetizationBanner = computed(
|
||||
() => selectedBreakdowns.value.includes('monetization') && !monetizationBannerDismissed.value,
|
||||
)
|
||||
const MAX_PREVIOUS_PERIOD_PERCENT_DISPLAY = 1000
|
||||
|
||||
const compactNumberFormatter = computed(
|
||||
() =>
|
||||
@@ -89,79 +57,16 @@ function formatStatNumber(value: number): string {
|
||||
|
||||
function formatPercent(value: number): string {
|
||||
const rounded = Math.round(value * 10) / 10
|
||||
if (rounded === 0) {
|
||||
return '0%'
|
||||
}
|
||||
|
||||
const signPrefix = rounded > 0 ? '+' : ''
|
||||
return `${signPrefix}${rounded.toFixed(1)}%`
|
||||
}
|
||||
|
||||
function formatSignedStatNumber(value: number): string {
|
||||
const signPrefix = value > 0 ? '+' : ''
|
||||
return `${signPrefix}${formatStatNumber(value)}`
|
||||
}
|
||||
|
||||
function formatSignedRevenue(value: number): string {
|
||||
const signPrefix = value > 0 ? '+' : value < 0 ? '-' : ''
|
||||
return `${signPrefix}${formatMessage(analyticsStatCardMessages.revenueValue, {
|
||||
value: formatStatNumber(Math.abs(value)),
|
||||
})}`
|
||||
}
|
||||
|
||||
function formatSignedPlaytimeHours(value: number): string {
|
||||
const rounded = Math.round(value * 10) / 10
|
||||
if (rounded === 0) {
|
||||
return '0'
|
||||
}
|
||||
|
||||
if (Math.abs(rounded) >= 1000) {
|
||||
const signPrefix = rounded > 0 ? '+' : ''
|
||||
return `${signPrefix}${compactNumberFormatter.value.format(rounded)}`
|
||||
}
|
||||
|
||||
const signPrefix = rounded > 0 ? '+' : ''
|
||||
return `${signPrefix}${rounded.toFixed(1)}`
|
||||
}
|
||||
|
||||
function formatSignedPlaytime(value: number): string {
|
||||
return formatMessage(analyticsStatCardMessages.playtimeHours, {
|
||||
hours: formatSignedPlaytimeHours(value / 3600),
|
||||
})
|
||||
}
|
||||
|
||||
function formatPreviousPeriodComparison(
|
||||
stat: AnalyticsDashboardStat,
|
||||
percentChange: number,
|
||||
currentValue: number,
|
||||
previousValue: number,
|
||||
): string | null {
|
||||
function formatPreviousPeriodPercent(value: number): string | null {
|
||||
if (!hasPreviousPeriodComparison.value) {
|
||||
return null
|
||||
}
|
||||
|
||||
const delta = currentValue - previousValue
|
||||
if (previousValue === 0 && currentValue === 0) {
|
||||
return formatPercent(percentChange)
|
||||
}
|
||||
|
||||
if (previousValue !== 0 && Math.abs(percentChange) <= MAX_PREVIOUS_PERIOD_PERCENT_DISPLAY) {
|
||||
return formatPercent(percentChange)
|
||||
}
|
||||
|
||||
switch (stat) {
|
||||
case 'revenue':
|
||||
return formatSignedRevenue(delta)
|
||||
case 'playtime':
|
||||
return formatSignedPlaytime(delta)
|
||||
case 'views':
|
||||
case 'downloads':
|
||||
return formatSignedStatNumber(delta)
|
||||
}
|
||||
}
|
||||
|
||||
function dismissMonetizationBanner() {
|
||||
monetizationBannerDismissed.value = true
|
||||
return formatPercent(value)
|
||||
}
|
||||
|
||||
const statCards = computed<
|
||||
@@ -178,12 +83,7 @@ const statCards = computed<
|
||||
key: 'views',
|
||||
label: formatAnalyticsStatLabel('views', formatMessage),
|
||||
statLabel: formatStatNumber(currentTotals.value.views),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodComparison(
|
||||
'views',
|
||||
percentChanges.value.views,
|
||||
currentTotals.value.views,
|
||||
previousTotals.value.views,
|
||||
),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodPercent(percentChanges.value.views),
|
||||
icon: 'eye',
|
||||
disabled: !isAnalyticsDashboardStatRelevant('views', selectedBreakdowns.value),
|
||||
},
|
||||
@@ -191,12 +91,7 @@ const statCards = computed<
|
||||
key: 'downloads',
|
||||
label: formatAnalyticsStatLabel('downloads', formatMessage),
|
||||
statLabel: formatStatNumber(currentTotals.value.downloads),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodComparison(
|
||||
'downloads',
|
||||
percentChanges.value.downloads,
|
||||
currentTotals.value.downloads,
|
||||
previousTotals.value.downloads,
|
||||
),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodPercent(percentChanges.value.downloads),
|
||||
icon: 'download',
|
||||
disabled: !isAnalyticsDashboardStatRelevant('downloads', selectedBreakdowns.value),
|
||||
},
|
||||
@@ -206,12 +101,7 @@ const statCards = computed<
|
||||
statLabel: formatMessage(analyticsStatCardMessages.revenueValue, {
|
||||
value: formatStatNumber(currentTotals.value.revenue),
|
||||
}),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodComparison(
|
||||
'revenue',
|
||||
percentChanges.value.revenue,
|
||||
currentTotals.value.revenue,
|
||||
previousTotals.value.revenue,
|
||||
),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodPercent(percentChanges.value.revenue),
|
||||
icon: 'dollar',
|
||||
disabled: !isAnalyticsDashboardStatRelevant('revenue', selectedBreakdowns.value),
|
||||
},
|
||||
@@ -221,12 +111,7 @@ const statCards = computed<
|
||||
statLabel: formatMessage(analyticsStatCardMessages.playtimeHours, {
|
||||
hours: formatStatNumber(currentTotals.value.playtime / 3600),
|
||||
}),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodComparison(
|
||||
'playtime',
|
||||
percentChanges.value.playtime,
|
||||
currentTotals.value.playtime,
|
||||
previousTotals.value.playtime,
|
||||
),
|
||||
vsPrevPeriodPercent: formatPreviousPeriodPercent(percentChanges.value.playtime),
|
||||
icon: 'clock',
|
||||
disabled: !isAnalyticsDashboardStatRelevant('playtime', selectedBreakdowns.value),
|
||||
},
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<AutoLink
|
||||
:to="currentAd.link"
|
||||
:aria-label="currentAd.description"
|
||||
class="flex max-h-[250px] min-h-[250px] min-w-[300px] max-w-[300px] flex-col gap-4 rounded-[inherit] border border-solid border-surface-4 bg-surface-3"
|
||||
class="flex max-h-[250px] min-h-[250px] min-w-[300px] max-w-[300px] flex-col gap-4 rounded-[inherit] bg-bg-raised"
|
||||
>
|
||||
<img
|
||||
:src="currentAd.light"
|
||||
@@ -19,7 +19,7 @@
|
||||
/>
|
||||
</AutoLink>
|
||||
<div
|
||||
class="absolute top-0 flex items-center justify-center overflow-hidden rounded-2xl border border-solid border-surface-4 bg-surface-3"
|
||||
class="absolute top-0 flex items-center justify-center overflow-hidden rounded-2xl bg-bg-raised"
|
||||
>
|
||||
<div id="modrinth-rail-1" />
|
||||
</div>
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
<template>
|
||||
<nav :aria-label="ariaLabel" class="w-full">
|
||||
<ul
|
||||
class="card-shadow m-0 flex list-none flex-col items-start gap-1.5 rounded-2xl border border-solid border-surface-4 bg-surface-3 p-4"
|
||||
:class="{ 'pt-3': filteredItems?.[0]?.type === 'heading' }"
|
||||
class="card-shadow m-0 flex list-none flex-col items-start gap-1.5 rounded-2xl bg-bg-raised p-4"
|
||||
>
|
||||
<slot v-if="hasSlotContent" />
|
||||
|
||||
|
||||
@@ -1,284 +1,244 @@
|
||||
<template>
|
||||
<div
|
||||
:class="
|
||||
type === 'server_invite'
|
||||
? { read: notification.read }
|
||||
: {
|
||||
notification: true,
|
||||
'has-body': hasBody,
|
||||
compact: compact,
|
||||
read: notification.read,
|
||||
}
|
||||
"
|
||||
class="notification"
|
||||
:class="{
|
||||
'has-body': hasBody,
|
||||
compact: compact,
|
||||
read: notification.read,
|
||||
}"
|
||||
>
|
||||
<template v-if="type === 'server_invite'">
|
||||
<div class="flex flex-col gap-4">
|
||||
<ModrinthServersIcon class="h-auto w-56 max-w-full text-[var(--color-heading)]" />
|
||||
<div
|
||||
class="flex flex-wrap items-center gap-x-1.5 gap-y-2 text-lg leading-tight text-[var(--color-heading)]"
|
||||
<nuxt-link
|
||||
v-if="!type"
|
||||
:to="notification.link"
|
||||
class="notification__icon backed-svg"
|
||||
:class="{ raised: raised }"
|
||||
>
|
||||
<BellIcon />
|
||||
</nuxt-link>
|
||||
<DoubleIcon v-else class="notification__icon">
|
||||
<template #primary>
|
||||
<nuxt-link v-if="project" :to="getProjectLink(project)" tabindex="-1">
|
||||
<Avatar size="xs" :src="project.icon_url" :raised="raised" no-shadow />
|
||||
</nuxt-link>
|
||||
<nuxt-link
|
||||
v-else-if="organization"
|
||||
:to="`/organization/${organization.slug}`"
|
||||
tabindex="-1"
|
||||
>
|
||||
<nuxt-link
|
||||
v-if="invitedBy"
|
||||
:to="`/user/${invitedBy.username}`"
|
||||
class="inline-flex items-center font-bold text-[var(--color-heading)] hover:underline"
|
||||
>
|
||||
<Avatar
|
||||
:src="invitedBy.avatar_url"
|
||||
circle
|
||||
size="xxs"
|
||||
no-shadow
|
||||
:raised="raised"
|
||||
class="mr-1.5 inline-flex"
|
||||
/>
|
||||
<span>{{ invitedBy.username }}</span>
|
||||
<Avatar size="xs" :src="organization.icon_url" :raised="raised" no-shadow />
|
||||
</nuxt-link>
|
||||
<nuxt-link v-else-if="user" :to="getUserLink(user)" tabindex="-1">
|
||||
<Avatar size="xs" :src="user.avatar_url" :raised="raised" no-shadow />
|
||||
</nuxt-link>
|
||||
<Avatar v-else size="xs" :raised="raised" no-shadow />
|
||||
</template>
|
||||
<template #secondary>
|
||||
<ScaleIcon
|
||||
v-if="type === 'moderator_message' || type === 'status_change'"
|
||||
class="moderation-color"
|
||||
/>
|
||||
<UserPlusIcon v-else-if="type === 'team_invite' && project" class="creator-color" />
|
||||
<UserPlusIcon
|
||||
v-else-if="type === 'organization_invite' && organization"
|
||||
class="creator-color"
|
||||
/>
|
||||
<VersionIcon v-else-if="type === 'project_update' && project && version" />
|
||||
<BellIcon v-else />
|
||||
</template>
|
||||
</DoubleIcon>
|
||||
<div class="notification__title">
|
||||
<template v-if="type === 'project_update' && project && version">
|
||||
A project you follow,
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">{{ project.title }}</nuxt-link>
|
||||
, has been updated:
|
||||
</template>
|
||||
<template v-else-if="type === 'team_invite' && project">
|
||||
<nuxt-link
|
||||
:to="`/user/${invitedBy.username}`"
|
||||
class="iconified-link title-link inline-flex"
|
||||
>
|
||||
<Avatar
|
||||
:src="invitedBy.avatar_url"
|
||||
circle
|
||||
size="xxs"
|
||||
no-shadow
|
||||
:raised="raised"
|
||||
class="inline-flex"
|
||||
/>
|
||||
<span class="space"> </span>
|
||||
<span>{{ invitedBy.username }}</span>
|
||||
</nuxt-link>
|
||||
<span>
|
||||
has invited you to join
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">
|
||||
{{ project.title }} </nuxt-link
|
||||
>.
|
||||
</span>
|
||||
</template>
|
||||
<template v-else-if="type === 'organization_invite' && organization">
|
||||
<nuxt-link
|
||||
:to="`/user/${invitedBy.username}`"
|
||||
class="iconified-link title-link inline-flex"
|
||||
>
|
||||
<Avatar
|
||||
:src="invitedBy.avatar_url"
|
||||
circle
|
||||
size="xxs"
|
||||
no-shadow
|
||||
:raised="raised"
|
||||
class="inline-flex"
|
||||
/>
|
||||
<span class="space"> </span>
|
||||
<span>{{ invitedBy.username }}</span>
|
||||
</nuxt-link>
|
||||
<span>
|
||||
has invited you to join
|
||||
<nuxt-link :to="`/organization/${organization.slug}`" class="title-link">
|
||||
{{ organization.name }} </nuxt-link
|
||||
>.
|
||||
</span>
|
||||
</template>
|
||||
<template v-else-if="type === 'status_change' && project">
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">
|
||||
{{ project.title }}
|
||||
</nuxt-link>
|
||||
<template v-if="tags.rejectedStatuses.includes(notification.body.new_status)">
|
||||
has been
|
||||
<ProjectStatusBadge :status="notification.body.new_status" />
|
||||
</template>
|
||||
<template v-else>
|
||||
updated from
|
||||
<ProjectStatusBadge :status="notification.body.old_status" />
|
||||
to
|
||||
<ProjectStatusBadge :status="notification.body.new_status" />
|
||||
</template>
|
||||
by the moderators.
|
||||
</template>
|
||||
<template v-else-if="type === 'moderator_message' && thread && project && !report">
|
||||
Your project,
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">{{ project.title }}</nuxt-link>
|
||||
, has received
|
||||
<template v-if="notification.grouped_notifs"> messages</template>
|
||||
<template v-else>a message</template>
|
||||
from the moderators.
|
||||
</template>
|
||||
<template v-else-if="type === 'moderator_message' && thread && report">
|
||||
A moderator replied to your report of
|
||||
<template v-if="version">
|
||||
version
|
||||
<nuxt-link :to="getVersionLink(project, version)" class="title-link">
|
||||
{{ version.name }}
|
||||
</nuxt-link>
|
||||
<span v-if="invitedBy">has invited you to manage</span>
|
||||
<span v-else>You have been invited to manage</span>
|
||||
<span
|
||||
><strong class="font-bold text-[var(--color-heading)]">{{
|
||||
notification.body.server_name
|
||||
}}</strong
|
||||
>.</span
|
||||
>
|
||||
</div>
|
||||
of project
|
||||
</template>
|
||||
<nuxt-link v-if="project" :to="getProjectLink(project)" class="title-link">
|
||||
{{ project.title }}
|
||||
</nuxt-link>
|
||||
<nuxt-link v-else-if="user" :to="getUserLink(user)" class="title-link">
|
||||
{{ user.username }}
|
||||
</nuxt-link>
|
||||
.
|
||||
</template>
|
||||
<nuxt-link v-else :to="notification.link" class="title-link">
|
||||
<span v-html="renderString(notification.title)" />
|
||||
</nuxt-link>
|
||||
<!-- <span v-else class="known-errors">Error reading notification.</span>-->
|
||||
</div>
|
||||
<div v-if="hasBody" class="notification__body">
|
||||
<ThreadSummary
|
||||
v-if="type === 'moderator_message' && thread"
|
||||
:thread="thread"
|
||||
:link="threadLink"
|
||||
:raised="raised"
|
||||
:messages="getMessages()"
|
||||
class="thread-summary"
|
||||
:auth="auth"
|
||||
/>
|
||||
<div v-else-if="type === 'project_update'" class="version-list">
|
||||
<div
|
||||
v-if="!notification.read"
|
||||
class="flex flex-wrap items-center gap-3"
|
||||
:class="{ 'gap-2': compact }"
|
||||
v-for="notif in (notification.grouped_notifs
|
||||
? [notification, ...notification.grouped_notifs]
|
||||
: [notification]
|
||||
).filter((x) => x.extra_data.version)"
|
||||
:key="notif.id"
|
||||
class="version-link"
|
||||
>
|
||||
<VersionIcon />
|
||||
<nuxt-link
|
||||
:to="getVersionLink(notif.extra_data.project, notif.extra_data.version)"
|
||||
class="text-link"
|
||||
>
|
||||
{{ notif.extra_data.version.name }}
|
||||
</nuxt-link>
|
||||
<span class="version-info">
|
||||
for
|
||||
<Categories
|
||||
:categories="getLoaderCategories(notif.extra_data.version)"
|
||||
:type="notif.extra_data.project.project_type"
|
||||
class="categories"
|
||||
/>
|
||||
{{ $formatVersion(notif.extra_data.version.game_versions) }}
|
||||
<span v-tooltip="formatDateTime(notif.extra_data.version.date_published)" class="date">
|
||||
{{ formatRelativeTime(notif.extra_data.version.date_published) }}
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<template v-else>
|
||||
{{ notification.text }}
|
||||
</template>
|
||||
</div>
|
||||
<span class="notification__date">
|
||||
<span v-if="notification.read" class="read-badge inline-flex">
|
||||
<CheckCircleIcon /> Read
|
||||
</span>
|
||||
<span v-tooltip="formatDateTime(notification.created)" class="inline-flex">
|
||||
<CalendarIcon class="mr-1" /> Received
|
||||
{{ formatRelativeTime(notification.created) }}
|
||||
</span>
|
||||
</span>
|
||||
<div v-if="compact" class="notification__actions">
|
||||
<template v-if="type === 'team_invite' || type === 'organization_invite'">
|
||||
<ButtonStyled circular color="brand" type="transparent">
|
||||
<button
|
||||
v-tooltip="`Accept`"
|
||||
@click="
|
||||
() => {
|
||||
acceptTeamInvite(notification.body.team_id)
|
||||
read()
|
||||
}
|
||||
"
|
||||
>
|
||||
<CheckIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled circular color="red" type="transparent">
|
||||
<button
|
||||
v-tooltip="`Decline`"
|
||||
@click="
|
||||
() => {
|
||||
removeSelfFromTeam(notification.body.team_id)
|
||||
read()
|
||||
}
|
||||
"
|
||||
>
|
||||
<XIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
<ButtonStyled v-else-if="!notification.read" circular type="transparent">
|
||||
<button v-tooltip="`Mark as read`" @click="read()">
|
||||
<XIcon />
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
<div v-else class="notification__actions">
|
||||
<div v-if="type !== null" class="input-group">
|
||||
<template
|
||||
v-if="(type === 'team_invite' || type === 'organization_invite') && !notification.read"
|
||||
>
|
||||
<ButtonStyled color="brand">
|
||||
<button @click="performActionByTitle(notification, 'Accept')">
|
||||
<CheckIcon />
|
||||
Accept
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled color="red">
|
||||
<button @click="performActionByTitle(notification, 'Deny')">
|
||||
<XIcon />
|
||||
Decline
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</div>
|
||||
<div
|
||||
class="mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-[var(--color-text-secondary)]"
|
||||
>
|
||||
<span
|
||||
v-if="notification.read"
|
||||
class="inline-flex items-center font-bold text-[var(--color-text)]"
|
||||
>
|
||||
<CheckCircleIcon /> Read
|
||||
</span>
|
||||
<span v-tooltip="formatDateTime(notification.created)" class="inline-flex items-center">
|
||||
<CalendarIcon class="mr-1" /> Received
|
||||
{{ formatRelativeTime(notification.created) }}
|
||||
</span>
|
||||
<CopyCode v-if="flags.developerMode" :text="notification.id" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<nuxt-link
|
||||
v-if="!type"
|
||||
:to="notification.link"
|
||||
class="notification__icon backed-svg"
|
||||
:class="{ raised: raised }"
|
||||
>
|
||||
<BellIcon />
|
||||
</nuxt-link>
|
||||
<DoubleIcon v-else class="notification__icon">
|
||||
<template #primary>
|
||||
<nuxt-link v-if="project" :to="getProjectLink(project)" tabindex="-1">
|
||||
<Avatar size="xs" :src="project.icon_url" :raised="raised" no-shadow />
|
||||
</nuxt-link>
|
||||
<nuxt-link
|
||||
v-else-if="organization"
|
||||
:to="`/organization/${organization.slug}`"
|
||||
tabindex="-1"
|
||||
>
|
||||
<Avatar size="xs" :src="organization.icon_url" :raised="raised" no-shadow />
|
||||
</nuxt-link>
|
||||
<nuxt-link v-else-if="user" :to="getUserLink(user)" tabindex="-1">
|
||||
<Avatar size="xs" :src="user.avatar_url" :raised="raised" no-shadow />
|
||||
</nuxt-link>
|
||||
<Avatar v-else size="xs" :raised="raised" no-shadow />
|
||||
</template>
|
||||
<template #secondary>
|
||||
<ScaleIcon
|
||||
v-if="type === 'moderator_message' || type === 'status_change'"
|
||||
class="moderation-color"
|
||||
/>
|
||||
<UserPlusIcon v-else-if="type === 'team_invite' && project" class="creator-color" />
|
||||
<UserPlusIcon
|
||||
v-else-if="type === 'organization_invite' && organization"
|
||||
class="creator-color"
|
||||
/>
|
||||
<VersionIcon v-else-if="type === 'project_update' && project && version" />
|
||||
<BellIcon v-else />
|
||||
</template>
|
||||
</DoubleIcon>
|
||||
<div class="notification__title">
|
||||
<template v-if="type === 'project_update' && project && version">
|
||||
A project you follow,
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">{{
|
||||
project.title
|
||||
}}</nuxt-link>
|
||||
, has been updated:
|
||||
</template>
|
||||
<template v-else-if="type === 'team_invite' && project">
|
||||
<nuxt-link
|
||||
:to="`/user/${invitedBy.username}`"
|
||||
class="iconified-link title-link inline-flex"
|
||||
>
|
||||
<Avatar
|
||||
:src="invitedBy.avatar_url"
|
||||
circle
|
||||
size="xxs"
|
||||
no-shadow
|
||||
:raised="raised"
|
||||
class="inline-flex"
|
||||
/>
|
||||
<span class="space"> </span>
|
||||
<span>{{ invitedBy.username }}</span>
|
||||
</nuxt-link>
|
||||
<span>
|
||||
has invited you to join
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">
|
||||
{{ project.title }} </nuxt-link
|
||||
>.
|
||||
</span>
|
||||
</template>
|
||||
<template v-else-if="type === 'organization_invite' && organization">
|
||||
<nuxt-link
|
||||
:to="`/user/${invitedBy.username}`"
|
||||
class="iconified-link title-link inline-flex"
|
||||
>
|
||||
<Avatar
|
||||
:src="invitedBy.avatar_url"
|
||||
circle
|
||||
size="xxs"
|
||||
no-shadow
|
||||
:raised="raised"
|
||||
class="inline-flex"
|
||||
/>
|
||||
<span class="space"> </span>
|
||||
<span>{{ invitedBy.username }}</span>
|
||||
</nuxt-link>
|
||||
<span>
|
||||
has invited you to join
|
||||
<nuxt-link :to="`/organization/${organization.slug}`" class="title-link">
|
||||
{{ organization.name }} </nuxt-link
|
||||
>.
|
||||
</span>
|
||||
</template>
|
||||
<template v-else-if="type === 'status_change' && project">
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">
|
||||
{{ project.title }}
|
||||
</nuxt-link>
|
||||
<template v-if="tags.rejectedStatuses.includes(notification.body.new_status)">
|
||||
has been
|
||||
<ProjectStatusBadge :status="notification.body.new_status" />
|
||||
</template>
|
||||
<template v-else>
|
||||
updated from
|
||||
<ProjectStatusBadge :status="notification.body.old_status" />
|
||||
to
|
||||
<ProjectStatusBadge :status="notification.body.new_status" />
|
||||
</template>
|
||||
by the moderators.
|
||||
</template>
|
||||
<template v-else-if="type === 'moderator_message' && thread && project && !report">
|
||||
Your project,
|
||||
<nuxt-link :to="getProjectLink(project)" class="title-link">{{
|
||||
project.title
|
||||
}}</nuxt-link>
|
||||
, has received
|
||||
<template v-if="notification.grouped_notifs"> messages</template>
|
||||
<template v-else>a message</template>
|
||||
from the moderators.
|
||||
</template>
|
||||
<template v-else-if="type === 'moderator_message' && thread && report">
|
||||
A moderator replied to your report of
|
||||
<template v-if="version">
|
||||
version
|
||||
<nuxt-link :to="getVersionLink(project, version)" class="title-link">
|
||||
{{ version.name }}
|
||||
</nuxt-link>
|
||||
of project
|
||||
</template>
|
||||
<nuxt-link v-if="project" :to="getProjectLink(project)" class="title-link">
|
||||
{{ project.title }}
|
||||
</nuxt-link>
|
||||
<nuxt-link v-else-if="user" :to="getUserLink(user)" class="title-link">
|
||||
{{ user.username }}
|
||||
</nuxt-link>
|
||||
.
|
||||
</template>
|
||||
<nuxt-link v-else :to="notification.link" class="title-link">
|
||||
<span v-html="renderString(notification.title)" />
|
||||
</nuxt-link>
|
||||
<!-- <span v-else class="known-errors">Error reading notification.</span>-->
|
||||
</div>
|
||||
<div v-if="hasBody" class="notification__body">
|
||||
<ThreadSummary
|
||||
v-if="type === 'moderator_message' && thread"
|
||||
:thread="thread"
|
||||
:link="threadLink"
|
||||
:raised="raised"
|
||||
:messages="getMessages()"
|
||||
class="thread-summary"
|
||||
:auth="auth"
|
||||
/>
|
||||
<div v-else-if="type === 'project_update'" class="version-list">
|
||||
<div
|
||||
v-for="notif in (notification.grouped_notifs
|
||||
? [notification, ...notification.grouped_notifs]
|
||||
: [notification]
|
||||
).filter((x) => x.extra_data.version)"
|
||||
:key="notif.id"
|
||||
class="version-link"
|
||||
>
|
||||
<VersionIcon />
|
||||
<nuxt-link
|
||||
:to="getVersionLink(notif.extra_data.project, notif.extra_data.version)"
|
||||
class="text-link"
|
||||
>
|
||||
{{ notif.extra_data.version.name }}
|
||||
</nuxt-link>
|
||||
<span class="version-info">
|
||||
for
|
||||
<Categories
|
||||
:categories="getLoaderCategories(notif.extra_data.version)"
|
||||
:type="notif.extra_data.project.project_type"
|
||||
class="categories"
|
||||
/>
|
||||
{{ $formatVersion(notif.extra_data.version.game_versions) }}
|
||||
<span
|
||||
v-tooltip="formatDateTime(notif.extra_data.version.date_published)"
|
||||
class="date"
|
||||
>
|
||||
{{ formatRelativeTime(notif.extra_data.version.date_published) }}
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<template v-else>
|
||||
{{ notification.text }}
|
||||
</template>
|
||||
</div>
|
||||
<span class="notification__date">
|
||||
<span v-if="notification.read" class="read-badge inline-flex">
|
||||
<CheckCircleIcon /> Read
|
||||
</span>
|
||||
<span v-tooltip="formatDateTime(notification.created)" class="inline-flex">
|
||||
<CalendarIcon class="mr-1" /> Received
|
||||
{{ formatRelativeTime(notification.created) }}
|
||||
</span>
|
||||
</span>
|
||||
<div v-if="compact" class="notification__actions">
|
||||
<template v-if="type === 'team_invite' || type === 'organization_invite'">
|
||||
<ButtonStyled circular color="brand" type="transparent">
|
||||
<button
|
||||
v-tooltip="`Accept`"
|
||||
@click="
|
||||
() => {
|
||||
acceptTeamInvite(notification.body.team_id)
|
||||
@@ -287,11 +247,11 @@
|
||||
"
|
||||
>
|
||||
<CheckIcon />
|
||||
Accept
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled circular color="red" type="transparent">
|
||||
<ButtonStyled color="red">
|
||||
<button
|
||||
v-tooltip="`Decline`"
|
||||
@click="
|
||||
() => {
|
||||
removeSelfFromTeam(notification.body.team_id)
|
||||
@@ -300,79 +260,41 @@
|
||||
"
|
||||
>
|
||||
<XIcon />
|
||||
Decline
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
<ButtonStyled v-else-if="!notification.read" circular type="transparent">
|
||||
<button v-tooltip="`Mark as read`" @click="read()">
|
||||
<XIcon />
|
||||
<ButtonStyled v-else-if="!notification.read">
|
||||
<button @click="read()">
|
||||
<CheckIcon />
|
||||
Mark as read
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<CopyCode v-if="flags.developerMode" :text="notification.id" />
|
||||
</div>
|
||||
<div v-else class="notification__actions">
|
||||
<div v-if="type !== null" class="input-group">
|
||||
<template
|
||||
v-if="(type === 'team_invite' || type === 'organization_invite') && !notification.read"
|
||||
>
|
||||
<ButtonStyled color="brand">
|
||||
<button
|
||||
@click="
|
||||
() => {
|
||||
acceptTeamInvite(notification.body.team_id)
|
||||
read()
|
||||
}
|
||||
"
|
||||
>
|
||||
<CheckIcon />
|
||||
Accept
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled color="red">
|
||||
<button
|
||||
@click="
|
||||
() => {
|
||||
removeSelfFromTeam(notification.body.team_id)
|
||||
read()
|
||||
}
|
||||
"
|
||||
>
|
||||
<XIcon />
|
||||
Decline
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
</template>
|
||||
<ButtonStyled v-else-if="!notification.read">
|
||||
<button @click="read()">
|
||||
<CheckIcon />
|
||||
Mark as read
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<CopyCode v-if="flags.developerMode" :text="notification.id" />
|
||||
</div>
|
||||
<div v-else class="input-group">
|
||||
<ButtonStyled v-if="notification.link && notification.link !== '#'">
|
||||
<nuxt-link :to="notification.link" target="_blank">
|
||||
<ExternalIcon />
|
||||
Open link
|
||||
</nuxt-link>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-for="(action, actionIndex) in notification.actions" :key="actionIndex">
|
||||
<button @click="performAction(notification, actionIndex)">
|
||||
<CheckIcon v-if="action.title === 'Accept'" />
|
||||
<XIcon v-else-if="action.title === 'Deny'" />
|
||||
{{ action.title }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-if="notification.actions.length === 0 && !notification.read">
|
||||
<button @click="performAction(notification, null)">
|
||||
<CheckIcon />
|
||||
Mark as read
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<CopyCode v-if="flags.developerMode" :text="notification.id" />
|
||||
</div>
|
||||
<div v-else class="input-group">
|
||||
<ButtonStyled v-if="notification.link && notification.link !== '#'">
|
||||
<nuxt-link :to="notification.link" target="_blank">
|
||||
<ExternalIcon />
|
||||
Open link
|
||||
</nuxt-link>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-for="(action, actionIndex) in notification.actions" :key="actionIndex">
|
||||
<button @click="performAction(notification, actionIndex)">
|
||||
<CheckIcon v-if="action.title === 'Accept'" />
|
||||
<XIcon v-else-if="action.title === 'Deny'" />
|
||||
{{ action.title }}
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<ButtonStyled v-if="notification.actions.length === 0 && !notification.read">
|
||||
<button @click="performAction(notification, null)">
|
||||
<CheckIcon />
|
||||
Mark as read
|
||||
</button>
|
||||
</ButtonStyled>
|
||||
<CopyCode v-if="flags.developerMode" :text="notification.id" />
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -406,13 +328,11 @@ import { markAsRead } from '~/helpers/platform-notifications'
|
||||
import { getProjectLink, getVersionLink } from '~/helpers/projects'
|
||||
import { acceptTeamInvite, removeSelfFromTeam } from '~/helpers/teams'
|
||||
|
||||
import ModrinthServersIcon from '../brand/ModrinthServersIcon.vue'
|
||||
import ThreadSummary from './thread/ThreadSummary.vue'
|
||||
|
||||
const client = injectModrinthClient()
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const emit = defineEmits(['update:notifications'])
|
||||
const router = useRouter()
|
||||
const formatRelativeTime = useRelativeTime()
|
||||
const formatDateTime = useFormatDateTime({
|
||||
timeStyle: 'short',
|
||||
@@ -495,29 +415,9 @@ async function performAction(notification, actionIndex) {
|
||||
await read()
|
||||
|
||||
if (actionIndex !== null) {
|
||||
const action = notification.actions[actionIndex]
|
||||
|
||||
if (type.value === 'server_invite') {
|
||||
const actionName = action.title.toLowerCase()
|
||||
const inviteAction = actionName === 'accept' ? 'accept' : 'decline'
|
||||
const serverId = notification.body.server_id
|
||||
|
||||
await client.request(`/servers/${serverId}/invites/${inviteAction}`, {
|
||||
api: 'archon',
|
||||
version: 1,
|
||||
method: 'POST',
|
||||
})
|
||||
|
||||
if (inviteAction === 'accept') {
|
||||
await router.push(`/hosting/manage/${encodeURIComponent(serverId)}`)
|
||||
}
|
||||
} else {
|
||||
const [method, route] = action.action_route
|
||||
|
||||
await useBaseFetch(route, {
|
||||
method: method.toUpperCase(),
|
||||
})
|
||||
}
|
||||
await useBaseFetch(`${notification.actions[actionIndex].action_route[1]}`, {
|
||||
method: notification.actions[actionIndex].action_route[0].toUpperCase(),
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
addNotification({
|
||||
@@ -529,20 +429,6 @@ async function performAction(notification, actionIndex) {
|
||||
stopLoading()
|
||||
}
|
||||
|
||||
function performActionByTitle(notification, title) {
|
||||
const actionIndex = notification.actions.findIndex((action) => action.title === title)
|
||||
if (actionIndex === -1) {
|
||||
addNotification({
|
||||
title: 'An error occurred',
|
||||
text: `Missing ${title.toLowerCase()} action for notification.`,
|
||||
type: 'error',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
return performAction(notification, actionIndex)
|
||||
}
|
||||
|
||||
function getMessages() {
|
||||
const messages = []
|
||||
if (props.notification.body.message_id) {
|
||||
|
||||
@@ -1,22 +1,20 @@
|
||||
<script setup lang="ts">
|
||||
import type { Archon } from '@modrinth/api-client'
|
||||
import { PlusIcon, XIcon } from '@modrinth/assets'
|
||||
import {
|
||||
Accordion,
|
||||
ButtonStyled,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
NewModal,
|
||||
ServerNotice,
|
||||
StyledInput,
|
||||
TagItem,
|
||||
} from '@modrinth/ui'
|
||||
import type { ServerNotice as ServerNoticeType } from '@modrinth/utils'
|
||||
import { ref } from 'vue'
|
||||
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const client = injectModrinthClient()
|
||||
import { useServersFetch } from '~/composables/servers/servers-fetch.ts'
|
||||
|
||||
type ServerNoticeType = Archon.Notices.v0.ListedNotice
|
||||
const { addNotification } = injectNotificationManager()
|
||||
|
||||
const modal = ref<InstanceType<typeof NewModal>>()
|
||||
|
||||
@@ -34,23 +32,28 @@ const assignedNodes = computed(() => assigned.value.filter((n) => n.kind === 'no
|
||||
const inputField = ref('')
|
||||
|
||||
async function refresh() {
|
||||
const notices = await client.archon.notices_v0.list()
|
||||
assigned.value = notices.find((n) => n.id === notice.value?.id)?.assigned ?? []
|
||||
await useServersFetch('notices').then((res) => {
|
||||
const notices = res as ServerNoticeType[]
|
||||
assigned.value = notices.find((n) => n.id === notice.value?.id)?.assigned ?? []
|
||||
})
|
||||
}
|
||||
|
||||
async function assign(server: boolean = true) {
|
||||
const input = inputField.value.trim()
|
||||
|
||||
if (input !== '' && notice.value) {
|
||||
await client.archon.notices_v0
|
||||
.assign(notice.value.id, server ? { server: input } : { node: input })
|
||||
.catch((err) => {
|
||||
addNotification({
|
||||
title: 'Error assigning notice',
|
||||
text: err,
|
||||
type: 'error',
|
||||
})
|
||||
await useServersFetch(
|
||||
`notices/${notice.value.id}/assign?${server ? 'server' : 'node'}=${input}`,
|
||||
{
|
||||
method: 'PUT',
|
||||
},
|
||||
).catch((err) => {
|
||||
addNotification({
|
||||
title: 'Error assigning notice',
|
||||
text: err,
|
||||
type: 'error',
|
||||
})
|
||||
})
|
||||
} else {
|
||||
addNotification({
|
||||
title: 'Error assigning notice',
|
||||
@@ -81,15 +84,18 @@ async function unassignDetect() {
|
||||
|
||||
async function unassign(id: string, server: boolean = true) {
|
||||
if (notice.value) {
|
||||
await client.archon.notices_v0
|
||||
.unassign(notice.value.id, server ? { server: id } : { node: id })
|
||||
.catch((err) => {
|
||||
addNotification({
|
||||
title: 'Error unassigning notice',
|
||||
text: err,
|
||||
type: 'error',
|
||||
})
|
||||
await useServersFetch(
|
||||
`notices/${notice.value.id}/unassign?${server ? 'server' : 'node'}=${id}`,
|
||||
{
|
||||
method: 'PUT',
|
||||
},
|
||||
).catch((err) => {
|
||||
addNotification({
|
||||
title: 'Error unassigning notice',
|
||||
text: err,
|
||||
type: 'error',
|
||||
})
|
||||
})
|
||||
}
|
||||
await refresh()
|
||||
}
|
||||
@@ -119,7 +125,7 @@ defineExpose({ show, hide })
|
||||
:level="notice.level"
|
||||
:message="notice.message"
|
||||
:dismissable="notice.dismissable"
|
||||
:title="notice.title ?? undefined"
|
||||
:title="notice.title"
|
||||
preview
|
||||
/>
|
||||
<div class="flex flex-col gap-2">
|
||||
|
||||
@@ -133,7 +133,6 @@ import { CheckIcon, PlusIcon, XIcon } from '@modrinth/assets'
|
||||
import {
|
||||
ButtonStyled,
|
||||
Combobox,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
NewModal,
|
||||
StyledInput,
|
||||
@@ -144,9 +143,9 @@ import { DEFAULT_CREDIT_EMAIL_MESSAGE } from '@modrinth/utils/utils.ts'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { useBaseFetch } from '#imports'
|
||||
import { useServersFetch } from '~/composables/servers/servers-fetch.ts'
|
||||
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const client = injectModrinthClient()
|
||||
|
||||
const modal = ref<InstanceType<typeof NewModal>>()
|
||||
|
||||
@@ -206,12 +205,12 @@ const applyDisabled = computed(() => {
|
||||
async function ensureOverview() {
|
||||
if (regions.value.length || nodeHostnames.value.length) return
|
||||
try {
|
||||
const data = await client.archon.nodes_internal.overview()
|
||||
regions.value = data.regions.map((r) => ({
|
||||
const data = await useServersFetch<any>('/nodes/overview', { version: 'internal' })
|
||||
regions.value = (data.regions || []).map((r: any) => ({
|
||||
value: r.key,
|
||||
label: `${r.display_name} (${r.key})`,
|
||||
}))
|
||||
nodeHostnames.value = data.node_hostnames
|
||||
nodeHostnames.value = data.node_hostnames || []
|
||||
if (!selectedRegion.value && regions.value.length) selectedRegion.value = regions.value[0].value
|
||||
} catch (err) {
|
||||
addNotification({ title: 'Failed to load nodes overview', text: String(err), type: 'error' })
|
||||
|
||||
@@ -198,7 +198,6 @@ import {
|
||||
ButtonStyled,
|
||||
Chips,
|
||||
Combobox,
|
||||
injectModrinthClient,
|
||||
injectNotificationManager,
|
||||
NewModal,
|
||||
StyledInput,
|
||||
@@ -208,12 +207,13 @@ import {
|
||||
import dayjs from 'dayjs'
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import { useServersFetch } from '~/composables/servers/servers-fetch.ts'
|
||||
|
||||
const emit = defineEmits<{
|
||||
success: []
|
||||
}>()
|
||||
|
||||
const { addNotification } = injectNotificationManager()
|
||||
const client = injectModrinthClient()
|
||||
|
||||
const modal = ref<InstanceType<typeof NewModal>>()
|
||||
|
||||
@@ -341,12 +341,12 @@ const submitDisabled = computed(() => {
|
||||
async function ensureOverview() {
|
||||
if (regions.value.length || nodeHostnames.value.length) return
|
||||
try {
|
||||
const data = await client.archon.nodes_internal.overview()
|
||||
regions.value = data.regions.map((r) => ({
|
||||
const data = await useServersFetch<any>('/nodes/overview', { version: 'internal' })
|
||||
regions.value = (data.regions || []).map((r: any) => ({
|
||||
value: r.key,
|
||||
label: `${r.display_name} (${r.key})`,
|
||||
}))
|
||||
nodeHostnames.value = data.node_hostnames
|
||||
nodeHostnames.value = data.node_hostnames || []
|
||||
if (!selectedRegion.value && regions.value.length) {
|
||||
selectedRegion.value = regions.value[0].value
|
||||
}
|
||||
@@ -364,22 +364,30 @@ async function submit() {
|
||||
scheduleOption.value === 'now' ? undefined : dayjs(scheduledDate.value).toISOString()
|
||||
|
||||
if (mode.value === 'servers') {
|
||||
await client.archon.transfers_internal.scheduleServers({
|
||||
server_ids: parsedServerIds.value,
|
||||
scheduled_at: scheduledAt,
|
||||
target_region: selectedRegion.value || undefined,
|
||||
node_tags: selectedTags.value.length > 0 ? selectedTags.value : undefined,
|
||||
reason: reason.value.trim(),
|
||||
await useServersFetch('/transfers/schedule/servers', {
|
||||
version: 'internal',
|
||||
method: 'POST',
|
||||
body: {
|
||||
server_ids: parsedServerIds.value,
|
||||
scheduled_at: scheduledAt,
|
||||
target_region: selectedRegion.value || undefined,
|
||||
node_tags: selectedTags.value.length > 0 ? selectedTags.value : undefined,
|
||||
reason: reason.value.trim(),
|
||||
},
|
||||
})
|
||||
} else {
|
||||
await client.archon.transfers_internal.scheduleNodes({
|
||||
node_hostnames: selectedNodes.value.slice(),
|
||||
scheduled_at: scheduledAt,
|
||||
target_region: selectedRegion.value || undefined,
|
||||
node_tags: selectedTags.value.length > 0 ? selectedTags.value : undefined,
|
||||
reason: reason.value.trim(),
|
||||
cordon_nodes: cordonNodes.value,
|
||||
tag_nodes: tagNodes.value.trim() || undefined,
|
||||
await useServersFetch('/transfers/schedule/nodes', {
|
||||
version: 'internal',
|
||||
method: 'POST',
|
||||
body: {
|
||||
node_hostnames: selectedNodes.value.slice(),
|
||||
scheduled_at: scheduledAt,
|
||||
target_region: selectedRegion.value || undefined,
|
||||
node_tags: selectedTags.value.length > 0 ? selectedTags.value : undefined,
|
||||
reason: reason.value.trim(),
|
||||
cordon_nodes: cordonNodes.value,
|
||||
tag_nodes: tagNodes.value.trim() || undefined,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -48,12 +48,7 @@
|
||||
>{{ isIncome ? '' : '-' }}{{ formatMoney(transaction.amount) }}</span
|
||||
>
|
||||
<template v-if="transaction.type === 'withdrawal' && transaction.status === 'in-transit'">
|
||||
<Tooltip
|
||||
theme="dismissable-prompt"
|
||||
class="inline-flex shrink-0"
|
||||
:triggers="['hover', 'focus']"
|
||||
no-auto-focus
|
||||
>
|
||||
<Tooltip theme="dismissable-prompt" :triggers="['hover', 'focus']" no-auto-focus>
|
||||
<span class="my-auto align-middle"
|
||||
><ButtonStyled circular type="outlined" size="small">
|
||||
<button class="align-middle" @click="cancelPayout">
|
||||
|
||||
@@ -565,7 +565,7 @@ const expandedClasses = reactive<Set<string>>(new Set())
|
||||
const autoExpandedFileIds = reactive<Set<string>>(new Set())
|
||||
const showCopyFeedback = reactive<Map<string, boolean>>(new Map())
|
||||
const highlightedSourceCache = reactive<Map<string, { source: string; lines: string[] }>>(new Map())
|
||||
const LAZY_LOAD_CLASS_SOURCE_MINIMUM = 2
|
||||
const LAZY_LOAD_CLASS_SOURCE_MINIMUM = 10
|
||||
|
||||
interface ClassGroup {
|
||||
key: string
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
v-if="sortedMessages.length > 0"
|
||||
:disabled="!replyBody || isLoading"
|
||||
@click="
|
||||
isApproved(project) && !isStaff(auth.user)
|
||||
isApproved(project)
|
||||
? openReplyModal()
|
||||
: runBlockingAction('reply', () => sendReply())
|
||||
"
|
||||
@@ -169,7 +169,7 @@
|
||||
v-else
|
||||
:disabled="!replyBody || isLoading"
|
||||
@click="
|
||||
isApproved(project) && !isStaff(auth.user)
|
||||
isApproved(project)
|
||||
? openReplyModal()
|
||||
: runBlockingAction('send', () => sendReply())
|
||||
"
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
export const useAffiliates = () => {
|
||||
const config = useRuntimeConfig()
|
||||
const affiliateCookie = useCookie('mrs_afl', {
|
||||
maxAge: 60 * 60 * 24 * 7, // 7 days
|
||||
sameSite: 'lax',
|
||||
secure: config.public.cookieSecure,
|
||||
secure: true,
|
||||
httpOnly: false,
|
||||
path: '/',
|
||||
})
|
||||
|
||||
@@ -30,11 +30,10 @@ export const initAuth = async (oldToken = null) => {
|
||||
}
|
||||
|
||||
const route = useRoute()
|
||||
const config = useRuntimeConfig()
|
||||
const authCookie = useCookie('auth-token', {
|
||||
maxAge: 60 * 60 * 24 * 365 * 10,
|
||||
sameSite: 'lax',
|
||||
secure: config.public.cookieSecure,
|
||||
secure: true,
|
||||
httpOnly: false,
|
||||
path: '/',
|
||||
})
|
||||
@@ -76,7 +75,6 @@ export const initAuth = async (oldToken = null) => {
|
||||
auth.user = await useBaseFetch(
|
||||
'user',
|
||||
{
|
||||
apiVersion: 3,
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
@@ -107,7 +105,6 @@ export const initAuth = async (oldToken = null) => {
|
||||
auth.user = await useBaseFetch(
|
||||
'user',
|
||||
{
|
||||
apiVersion: 3,
|
||||
headers: {
|
||||
Authorization: auth.token,
|
||||
},
|
||||
|
||||
@@ -54,8 +54,6 @@ export const DEFAULT_FEATURE_FLAGS = validateValues({
|
||||
showViewProdRouteBanner: false,
|
||||
showModeratorProjectMemberUi: false,
|
||||
showModeratorPrivateMessageHighlight: true,
|
||||
archonApiStaging: false,
|
||||
showHostingAccessInstanceAuditLog: false,
|
||||
} as const)
|
||||
|
||||
export type FeatureFlag = keyof typeof DEFAULT_FEATURE_FLAGS
|
||||
@@ -66,20 +64,19 @@ export type AllFeatureFlags = {
|
||||
|
||||
export type PartialFeatureFlags = Partial<AllFeatureFlags>
|
||||
|
||||
const getCookieOptions = () =>
|
||||
({
|
||||
maxAge: 60 * 60 * 24 * 365 * 10,
|
||||
sameSite: 'lax',
|
||||
secure: useRuntimeConfig().public.cookieSecure,
|
||||
httpOnly: false,
|
||||
path: '/',
|
||||
}) satisfies CookieOptions<PartialFeatureFlags>
|
||||
const COOKIE_OPTIONS = {
|
||||
maxAge: 60 * 60 * 24 * 365 * 10,
|
||||
sameSite: 'lax',
|
||||
secure: true,
|
||||
httpOnly: false,
|
||||
path: '/',
|
||||
} satisfies CookieOptions<PartialFeatureFlags>
|
||||
|
||||
export const useFeatureFlags = () =>
|
||||
useState<AllFeatureFlags>('featureFlags', () => {
|
||||
const config = useRuntimeConfig()
|
||||
|
||||
const savedFlags = useCookie<PartialFeatureFlags>('featureFlags', getCookieOptions())
|
||||
const savedFlags = useCookie<PartialFeatureFlags>('featureFlags', COOKIE_OPTIONS)
|
||||
|
||||
if (!savedFlags.value) {
|
||||
savedFlags.value = {}
|
||||
@@ -109,6 +106,6 @@ export const useFeatureFlags = () =>
|
||||
|
||||
export const saveFeatureFlags = () => {
|
||||
const flags = useFeatureFlags()
|
||||
const cookie = useCookie<PartialFeatureFlags>('featureFlags', getCookieOptions())
|
||||
const cookie = useCookie<PartialFeatureFlags>('featureFlags', COOKIE_OPTIONS)
|
||||
cookie.value = flags.value
|
||||
}
|
||||
|
||||
@@ -0,0 +1,264 @@
|
||||
/**
|
||||
* @deprecated Use `@modrinth/api-client` via `injectModrinthClient()` instead.
|
||||
* The api-client's archon modules (`client.archon.servers_v0`, etc.) handle auth,
|
||||
* retry, and circuit breaking automatically. This composable is kept for legacy
|
||||
* code that hasn't been migrated yet.
|
||||
*/
|
||||
|
||||
import { PANEL_VERSION } from '@modrinth/api-client'
|
||||
import type { V1ErrorInfo } from '@modrinth/utils'
|
||||
import { ModrinthServerError, ModrinthServersFetchError } from '@modrinth/utils'
|
||||
import { $fetch, FetchError } from 'ofetch'
|
||||
|
||||
export interface ServersFetchOptions {
|
||||
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
|
||||
contentType?: string
|
||||
body?: Record<string, any>
|
||||
version?: number | 'internal'
|
||||
override?: {
|
||||
url?: string
|
||||
token?: string
|
||||
}
|
||||
retry?: number | boolean
|
||||
bypassAuth?: boolean
|
||||
}
|
||||
|
||||
export async function useServersFetch<T>(
|
||||
path: string,
|
||||
options: ServersFetchOptions = {},
|
||||
module?: string,
|
||||
errorContext?: string,
|
||||
): Promise<T> {
|
||||
const config = useRuntimeConfig()
|
||||
const auth = await useAuth()
|
||||
const authToken = auth.value?.token
|
||||
|
||||
if (!authToken && !options.bypassAuth) {
|
||||
const error = new ModrinthServersFetchError(
|
||||
'[Modrinth Hosting] Cannot fetch without auth',
|
||||
10000,
|
||||
)
|
||||
throw new ModrinthServerError('Missing auth token', 401, error, module, undefined, undefined)
|
||||
}
|
||||
|
||||
const {
|
||||
method = 'GET',
|
||||
contentType = 'application/json',
|
||||
body,
|
||||
version = 0,
|
||||
override,
|
||||
retry = method === 'GET' ? 3 : 0,
|
||||
} = options
|
||||
|
||||
const circuitBreakerKey = `${module || 'default'}_${path}`
|
||||
const failureCount = useState<number>(`fetch_failures_${circuitBreakerKey}`, () => 0)
|
||||
const lastFailureTime = useState<number>(`last_failure_${circuitBreakerKey}`, () => 0)
|
||||
|
||||
const now = Date.now()
|
||||
if (failureCount.value >= 3 && now - lastFailureTime.value < 30000) {
|
||||
const error = new ModrinthServersFetchError(
|
||||
'[Modrinth Hosting] Circuit breaker open - too many recent failures',
|
||||
503,
|
||||
)
|
||||
throw new ModrinthServerError(
|
||||
'Service temporarily unavailable',
|
||||
503,
|
||||
error,
|
||||
module,
|
||||
undefined,
|
||||
undefined,
|
||||
)
|
||||
}
|
||||
|
||||
if (now - lastFailureTime.value > 30000) {
|
||||
failureCount.value = 0
|
||||
}
|
||||
|
||||
const base = (import.meta.server ? config.pyroBaseUrl : config.public.pyroBaseUrl)?.replace(
|
||||
/\/$/,
|
||||
'',
|
||||
)
|
||||
|
||||
if (!base) {
|
||||
const error = new ModrinthServersFetchError(
|
||||
'[Modrinth Hosting] Cannot fetch without base url. Make sure to set a PYRO_BASE_URL in environment variables',
|
||||
10001,
|
||||
)
|
||||
throw new ModrinthServerError(
|
||||
'Configuration error: Missing PYRO_BASE_URL',
|
||||
500,
|
||||
error,
|
||||
module,
|
||||
undefined,
|
||||
undefined,
|
||||
)
|
||||
}
|
||||
|
||||
const versionString = `v${version}`
|
||||
let newOverrideUrl = override?.url
|
||||
if (newOverrideUrl && newOverrideUrl.includes('v0') && version !== 0) {
|
||||
newOverrideUrl = newOverrideUrl.replace('v0', versionString)
|
||||
}
|
||||
|
||||
const fullUrl = newOverrideUrl
|
||||
? `https://${newOverrideUrl}/${path.replace(/^\//, '')}`
|
||||
: version === 0
|
||||
? `${base}/modrinth/v${version}/${path.replace(/^\//, '')}`
|
||||
: version === 'internal'
|
||||
? `${base}/_internal/${path.replace(/^\//, '')}`
|
||||
: `${base}/v${version}/${path.replace(/^\//, '')}`
|
||||
|
||||
const headers: Record<string, string> = {
|
||||
'User-Agent': 'Modrinth/1.0 (https://modrinth.com)',
|
||||
'X-Archon-Request': 'true',
|
||||
'X-Panel-Version': String(PANEL_VERSION),
|
||||
Vary: 'Accept, Origin',
|
||||
}
|
||||
|
||||
if (!options.bypassAuth) {
|
||||
headers.Authorization = `Bearer ${override?.token ?? authToken}`
|
||||
headers['Access-Control-Allow-Headers'] = 'Authorization'
|
||||
}
|
||||
|
||||
if (contentType !== 'none') {
|
||||
headers['Content-Type'] = contentType
|
||||
}
|
||||
|
||||
if (import.meta.client && typeof window !== 'undefined') {
|
||||
headers.Origin = window.location.origin
|
||||
}
|
||||
|
||||
let attempts = 0
|
||||
const maxAttempts = (typeof retry === 'boolean' ? (retry ? 3 : 1) : retry) + 1
|
||||
let lastError: Error | null = null
|
||||
|
||||
while (attempts < maxAttempts) {
|
||||
try {
|
||||
const response = await $fetch<T>(fullUrl, {
|
||||
method,
|
||||
headers,
|
||||
body:
|
||||
body && contentType === 'application/json' ? JSON.stringify(body) : (body ?? undefined),
|
||||
timeout: 10000,
|
||||
})
|
||||
|
||||
failureCount.value = 0
|
||||
return response
|
||||
} catch (error) {
|
||||
lastError = error as Error
|
||||
attempts++
|
||||
|
||||
if (error instanceof FetchError) {
|
||||
const statusCode = error.response?.status
|
||||
const statusText = error.response?.statusText || 'Unknown error'
|
||||
|
||||
if (statusCode && statusCode >= 500) {
|
||||
failureCount.value++
|
||||
lastFailureTime.value = now
|
||||
}
|
||||
|
||||
let v1Error: V1ErrorInfo | undefined
|
||||
if (error.data?.error && error.data?.description) {
|
||||
v1Error = {
|
||||
context: errorContext,
|
||||
...error.data,
|
||||
}
|
||||
}
|
||||
|
||||
const errorMessages: { [key: number]: string } = {
|
||||
400: 'Bad Request',
|
||||
401: 'Unauthorized',
|
||||
403: 'Forbidden',
|
||||
404: 'Not Found',
|
||||
405: 'Method Not Allowed',
|
||||
408: 'Request Timeout',
|
||||
429: "You're making requests too quickly. Please wait a moment and try again.",
|
||||
500: 'Internal Server Error',
|
||||
502: 'Bad Gateway',
|
||||
503: 'Service Unavailable',
|
||||
504: 'Gateway Timeout',
|
||||
}
|
||||
|
||||
const message =
|
||||
statusCode && statusCode in errorMessages
|
||||
? errorMessages[statusCode]
|
||||
: `HTTP Error: ${statusCode || 'unknown'} ${statusText}`
|
||||
|
||||
const isRetryable = statusCode ? [408, 429].includes(statusCode) : false
|
||||
const is5xxRetryable =
|
||||
statusCode && statusCode >= 500 && statusCode < 600 && method === 'GET' && attempts === 1
|
||||
|
||||
if (!(isRetryable || is5xxRetryable) || attempts >= maxAttempts) {
|
||||
console.error('Fetch error:', error)
|
||||
|
||||
const fetchError = new ModrinthServersFetchError(
|
||||
`[Modrinth Hosting] ${error.message}`,
|
||||
statusCode,
|
||||
error,
|
||||
)
|
||||
throw new ModrinthServerError(
|
||||
`[Modrinth Hosting] ${message}`,
|
||||
statusCode,
|
||||
fetchError,
|
||||
module,
|
||||
v1Error,
|
||||
error.data,
|
||||
)
|
||||
}
|
||||
|
||||
const baseDelay = statusCode && statusCode >= 500 ? 5000 : 1000
|
||||
const delay = Math.min(baseDelay * Math.pow(2, attempts - 1) + Math.random() * 1000, 15000)
|
||||
console.warn(`Retrying request in ${delay}ms (attempt ${attempts}/${maxAttempts - 1})`)
|
||||
await new Promise((resolve) => setTimeout(resolve, delay))
|
||||
continue
|
||||
}
|
||||
|
||||
console.error('Unexpected fetch error:', error)
|
||||
const fetchError = new ModrinthServersFetchError(
|
||||
'[Modrinth Hosting] An unexpected error occurred during the fetch operation.',
|
||||
undefined,
|
||||
error as Error,
|
||||
)
|
||||
throw new ModrinthServerError(
|
||||
'Unexpected error during fetch operation',
|
||||
undefined,
|
||||
fetchError,
|
||||
module,
|
||||
undefined,
|
||||
undefined,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
console.error('All retry attempts failed:', lastError)
|
||||
if (lastError instanceof FetchError) {
|
||||
const statusCode = lastError.response?.status
|
||||
const pyroError = new ModrinthServersFetchError(
|
||||
'Maximum retry attempts reached',
|
||||
statusCode,
|
||||
lastError,
|
||||
)
|
||||
throw new ModrinthServerError(
|
||||
'Maximum retry attempts reached',
|
||||
statusCode,
|
||||
pyroError,
|
||||
module,
|
||||
undefined,
|
||||
lastError.data,
|
||||
)
|
||||
}
|
||||
|
||||
const fetchError = new ModrinthServersFetchError(
|
||||
'Maximum retry attempts reached',
|
||||
undefined,
|
||||
lastError || undefined,
|
||||
)
|
||||
throw new ModrinthServerError(
|
||||
'Maximum retry attempts reached',
|
||||
undefined,
|
||||
fetchError,
|
||||
module,
|
||||
undefined,
|
||||
undefined,
|
||||
)
|
||||
}
|
||||
@@ -17,6 +17,7 @@ export type FilterSelection = {
|
||||
const cookieDefaults = {
|
||||
maxAge: TEN_MINUTES,
|
||||
sameSite: 'lax' as const,
|
||||
secure: true,
|
||||
path: '/',
|
||||
httpOnly: false,
|
||||
}
|
||||
@@ -51,19 +52,13 @@ function newFilterSelection(
|
||||
}
|
||||
|
||||
export function useCdnDownloadContext() {
|
||||
const config = useRuntimeConfig()
|
||||
const cookieOptions = {
|
||||
...cookieDefaults,
|
||||
secure: config.public.cookieSecure,
|
||||
}
|
||||
|
||||
const filterGameVersionCookie = useCookie<string | null>('mr_download_filter_game_version', {
|
||||
...cookieOptions,
|
||||
...cookieDefaults,
|
||||
default: () => null,
|
||||
})
|
||||
|
||||
const filterLoaderCookie = useCookie<string | null>('mr_download_filter_loader', {
|
||||
...cookieOptions,
|
||||
...cookieDefaults,
|
||||
default: () => null,
|
||||
})
|
||||
|
||||
|
||||
@@ -14,7 +14,6 @@ import {
|
||||
import type { Ref } from 'vue'
|
||||
|
||||
import { useFeatureFlags } from '~/composables/featureFlags.ts'
|
||||
import { withStagingArchonBaseUrl } from '~/helpers/archon.ts'
|
||||
|
||||
async function getRateLimitKeyFromSecretsStore(): Promise<string | undefined> {
|
||||
try {
|
||||
@@ -38,8 +37,7 @@ export function createModrinthClient(
|
||||
|
||||
const clientConfig: NuxtClientConfig = {
|
||||
labrinthBaseUrl: config.apiBaseUrl,
|
||||
archonBaseUrl: () =>
|
||||
withStagingArchonBaseUrl(config.archonBaseUrl, flags.value.archonApiStaging),
|
||||
archonBaseUrl: config.archonBaseUrl,
|
||||
archonSentryCapture: () => flags.value.archonSentryCapture,
|
||||
rateLimitKey: config.rateLimitKey || getRateLimitKeyFromSecretsStore,
|
||||
features: [
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
export const STAGING_ARCHON_BASE_URL = 'https://staging-archon.modrinth.com/'
|
||||
|
||||
export function withStagingArchonBaseUrl(
|
||||
baseUrl: string,
|
||||
useStaging = useFeatureFlags().value.archonApiStaging,
|
||||
) {
|
||||
if (!useStaging) {
|
||||
return baseUrl
|
||||
}
|
||||
|
||||
return STAGING_ARCHON_BASE_URL
|
||||
}
|
||||
@@ -793,7 +793,6 @@ import ModrinthFooter from '~/components/ui/ModrinthFooter.vue'
|
||||
import { getSignInRouteObj } from '~/composables/auth.js'
|
||||
import { errors as generatedStateErrors } from '~/generated/state.json'
|
||||
import { getProjectTypeMessage } from '~/utils/i18n-project-type.ts'
|
||||
import { hasActiveMidas } from '~/utils/user-membership.ts'
|
||||
|
||||
const generatedState = useGeneratedState()
|
||||
|
||||
@@ -1097,7 +1096,7 @@ const userMenuOptions = computed(() => {
|
||||
id: 'plus',
|
||||
link: '/plus',
|
||||
color: 'purple',
|
||||
shown: !flags.value.hidePlusPromoInUserMenu && !hasActiveMidas(user),
|
||||
shown: !flags.value.hidePlusPromoInUserMenu && !isPermission(user.badges, 1 << 0),
|
||||
},
|
||||
{
|
||||
id: 'servers',
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ ميغابايت"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ ميغابايت"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 ميغابايت"
|
||||
},
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -1913,6 +1916,12 @@
|
||||
"project.settings.title": {
|
||||
"message": "Indstillinger"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "download{count, plural, one {} other {s}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "følger{count, plural, one {} other {e}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} er blevet arkiveret. {title} vil ikke modtage flere opdateringer medmindre forfatteren beslutter sig for at fjerne projektet fra arkivet."
|
||||
},
|
||||
|
||||
@@ -8,438 +8,6 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Benutzer nicht gefunden"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Hinzufügen"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Abbrechen"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "Aktualisieren"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "Zurücksetzen"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Land"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Downloadgrund"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "Downloadquelle"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Spielversion"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "Auswertung"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetarisierung"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "Keine Auswertung"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Projekt"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Projektstatus"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Projektversion"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "Auswertung nach {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Alle anzeigen"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "Zeige limitierte"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Top 8 anzeigen"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} Std."
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} aktiv"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "Anmerkungen"
|
||||
},
|
||||
"analytics.chart.controls.dialog-aria": {
|
||||
"message": "Analyse Graph Kontrolle"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "Anzeige"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Modrinth Ereignisse"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Keine Modrinth Ereignisse im Graph."
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "Keine Projektereignisse im Graph."
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "Projektereignisse"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "Verhältnis"
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, one {# Analyseereignis} other {# Analyseereignisse}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Ankündigung ansehen"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.aria": {
|
||||
"message": "Zeige monetarisierte Analyse Details"
|
||||
},
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (Vorherige)"
|
||||
},
|
||||
"analytics.chart.render-limit.description": {
|
||||
"message": "Anzeigen aller ausgewählten Zeilen von der Liste könnte die Performance beeinflussen."
|
||||
},
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Alle {count} Zeilen im Graph anzeigen?"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Zeige {count} {itemType, select, project {{count, plural, one {project} other {projects}}} country {{count, plural, one {country} other {countries}}} monetization {{count, plural, one {monetization value} other {monetization values}}} downloadSource {{count, plural, one {download source} other {download sources}}} downloadReason {{count, plural, one {download reason} other {download reasons}}} projectVersion {{count, plural, one {project version} other {project versions}}} loader {{count, plural, one {loader} other {loaders}}} gameVersion {{count, plural, one {game version} other {game versions}}} other {{count, plural, one {item} other {items}}}} der Liste"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Zeige {limit} {itemType, select, project {{limit, plural, one {project} other {projects}}} country {{limit, plural, one {country} other {countries}}} monetization {{limit, plural, one {monetization value} other {monetization values}}} downloadSource {{limit, plural, one {download source} other {download sources}}} downloadReason {{limit, plural, one {download reason} other {download reasons}}} projectVersion {{limit, plural, one {project version} other {project versions}}} loader {{limit, plural, one {loader} other {loaders}}} gameVersion {{limit, plural, one {game version} other {game versions}}} other {{limit, plural, one {item} other {items}}}} der Liste"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Zeige top {count} {itemType, select, project {{count, plural, one {project} other {projects}}} country {{count, plural, one {country} other {countries}}} monetization {{count, plural, one {monetization value} other {monetization values}}} downloadSource {{count, plural, one {download source} other {download sources}}} downloadReason {{count, plural, one {download reason} other {download reasons}}} projectVersion {{count, plural, one {project version} other {project versions}}} loader {{count, plural, one {loader} other {loaders}}} gameVersion {{count, plural, one {game version} other {game versions}}} other {{count, plural, one {item} other {items}}}} von der Liste"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# Tag} other {# Tage}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# Stunde} other {# Stunden}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, one {# Minute} other {# Minuten}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "{name} im Diagramm ausblenden"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned-aria": {
|
||||
"message": "Angepinnt"
|
||||
},
|
||||
"analytics.chart.tooltip.previous-period-short": {
|
||||
"message": "(Vorherige)"
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "Gesamt"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "Fläche"
|
||||
},
|
||||
"analytics.chart.view.bar": {
|
||||
"message": "Balken"
|
||||
},
|
||||
"analytics.chart.view.line": {
|
||||
"message": "Linie"
|
||||
},
|
||||
"analytics.download-reason.dependency": {
|
||||
"message": "Abhängigkeit"
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "Modpack"
|
||||
},
|
||||
"analytics.download-reason.standalone": {
|
||||
"message": "Eigenständig"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "Aktualisierung"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "Modrinth Website"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "Downloads"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "Keine Daten verfügbar"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "Keine Daten verfügbar für diese Analysen"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "Keine Projekte verfügbar"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "Keine Projekte für die Analyse verfügbar"
|
||||
},
|
||||
"analytics.empty.select-project": {
|
||||
"message": "Wähle mindestens ein Projekt aus um Daten anzuzeigen"
|
||||
},
|
||||
"analytics.filter.game-version-type": {
|
||||
"message": "Spiel Version wählen"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Alle"
|
||||
},
|
||||
"analytics.filter.game-version-type.release": {
|
||||
"message": "Veröffentlichung"
|
||||
},
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Länder durchsuchen..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Download-Quellen durchsuchen..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Projektversionen durchsuchen..."
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "Versionen durchsuchen..."
|
||||
},
|
||||
"analytics.graph.title.downloads": {
|
||||
"message": "Downloads im Laufe der Zeit"
|
||||
},
|
||||
"analytics.graph.title.playtime": {
|
||||
"message": "Spielzeit im Laufe der Zeit"
|
||||
},
|
||||
"analytics.graph.title.revenue": {
|
||||
"message": "Einnahmen im Laufe der Zeit"
|
||||
},
|
||||
"analytics.graph.title.views": {
|
||||
"message": "Ansichten im Laufe der Zeit"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1 Std."
|
||||
},
|
||||
"analytics.group-by.6h": {
|
||||
"message": "6 Std."
|
||||
},
|
||||
"analytics.group-by.date": {
|
||||
"message": "Datum"
|
||||
},
|
||||
"analytics.group-by.day": {
|
||||
"message": "Tag"
|
||||
},
|
||||
"analytics.group-by.month": {
|
||||
"message": "Monat"
|
||||
},
|
||||
"analytics.group-by.selected.day": {
|
||||
"message": "Nach Tag gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.hour": {
|
||||
"message": "Nach Stunde gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.month": {
|
||||
"message": "Nach Monat gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.six-hours": {
|
||||
"message": "Nach 6 Stunden gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.week": {
|
||||
"message": "Nach Woche gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.year": {
|
||||
"message": "Nach Jahr gruppieren"
|
||||
},
|
||||
"analytics.group-by.week": {
|
||||
"message": "Woche"
|
||||
},
|
||||
"analytics.group-by.year": {
|
||||
"message": "Jahr"
|
||||
},
|
||||
"analytics.loading.fetching-results": {
|
||||
"message": "Ergebnisse werden abgerufen..."
|
||||
},
|
||||
"analytics.options.loading": {
|
||||
"message": "Wird geladen..."
|
||||
},
|
||||
"analytics.project-event.project-approved": {
|
||||
"message": "Projekt angenommen"
|
||||
},
|
||||
"analytics.project-event.project-private": {
|
||||
"message": "Projekt auf Privat gestellt"
|
||||
},
|
||||
"analytics.project-event.project-status-changed": {
|
||||
"message": "Projektstatus geändert"
|
||||
},
|
||||
"analytics.project-event.project-unlisted": {
|
||||
"message": "Projekt entlistet"
|
||||
},
|
||||
"analytics.project-event.version-released": {
|
||||
"message": "{version} veröffentlicht"
|
||||
},
|
||||
"analytics.project-event.version-uploaded": {
|
||||
"message": "Version hochgeladen"
|
||||
},
|
||||
"analytics.project-status.approved": {
|
||||
"message": "Angenommen"
|
||||
},
|
||||
"analytics.project-status.archived": {
|
||||
"message": "Archiviert"
|
||||
},
|
||||
"analytics.project-status.draft": {
|
||||
"message": "Entwurf"
|
||||
},
|
||||
"analytics.project-status.other": {
|
||||
"message": "Andere"
|
||||
},
|
||||
"analytics.project-status.private": {
|
||||
"message": "Privat"
|
||||
},
|
||||
"analytics.project-status.rejected": {
|
||||
"message": "Abgelehnt"
|
||||
},
|
||||
"analytics.project-status.unlisted": {
|
||||
"message": "Nicht gelistet"
|
||||
},
|
||||
"analytics.project-status.withheld": {
|
||||
"message": "Zurückgehalten"
|
||||
},
|
||||
"analytics.project.all": {
|
||||
"message": "Alle Projekte"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# Projekt} other {# Projekte}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name} Icon"
|
||||
},
|
||||
"analytics.project.select": {
|
||||
"message": "Projekte auswählen"
|
||||
},
|
||||
"analytics.query.filter.add": {
|
||||
"message": "Filter hinzufügen"
|
||||
},
|
||||
"analytics.query.label.breakdown": {
|
||||
"message": "Auswertung:"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "Gruppiert nach"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "Projekt:"
|
||||
},
|
||||
"analytics.query.label.timeframe": {
|
||||
"message": "Zeitfenster:"
|
||||
},
|
||||
"analytics.stat.downloads": {
|
||||
"message": "Downloads"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Spielzeit"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} Std."
|
||||
},
|
||||
"analytics.stat.previous-period-comparison": {
|
||||
"message": "im Vergleich zum vorherigen Zeitraum"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison-short": {
|
||||
"message": "im Vergleich zum vorherigen"
|
||||
},
|
||||
"analytics.stat.revenue": {
|
||||
"message": "Einnahmen"
|
||||
},
|
||||
"analytics.stat.revenue-value": {
|
||||
"message": "${value}"
|
||||
},
|
||||
"analytics.stat.unavailable": {
|
||||
"message": "N/A"
|
||||
},
|
||||
"analytics.stat.unavailable-tooltip": {
|
||||
"message": "Statistik nicht verfügbar für aktuellen Filter"
|
||||
},
|
||||
"analytics.stat.views": {
|
||||
"message": "Ansichten"
|
||||
},
|
||||
"analytics.table.csv.date-range": {
|
||||
"message": "{start} bis {end}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Spielzeit (Sekunden)"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, one {# Tag} other {# Tage}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, one {# Stunde} other {# Stunden}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, one {# Minute} other {# Minuten}}"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "CSV exportieren"
|
||||
},
|
||||
"analytics.table.export.cumulative": {
|
||||
"message": "Kumulativ"
|
||||
},
|
||||
"analytics.table.export.grouped": {
|
||||
"message": "Gruppiert nach {groupBy}"
|
||||
},
|
||||
"analytics.table.pagination.summary": {
|
||||
"message": "{start} bis {end} von {total} werden angezeigt"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Suchen..."
|
||||
},
|
||||
"analytics.threshold.countries-above": {
|
||||
"message": "Länder über"
|
||||
},
|
||||
"analytics.threshold.country-downloads-aria": {
|
||||
"message": "Schwellenwert für Downloads nach Land"
|
||||
},
|
||||
"analytics.threshold.game-version-downloads-aria": {
|
||||
"message": "Schwellenwert für Downloads von Spielversionen"
|
||||
},
|
||||
"analytics.threshold.game-versions-above": {
|
||||
"message": "Spielversionen über"
|
||||
},
|
||||
"analytics.threshold.project-downloads-aria": {
|
||||
"message": "Schwellenwert für Projekt-Downloads"
|
||||
},
|
||||
"analytics.threshold.project-version-downloads-aria": {
|
||||
"message": "Schwellenwert für Projektversionen-Downloads"
|
||||
},
|
||||
"analytics.threshold.project-versions-above": {
|
||||
"message": "Projektversionen über"
|
||||
},
|
||||
"analytics.threshold.projects-above": {
|
||||
"message": "Projekte über"
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "Analysen"
|
||||
},
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetarisiert"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Keine"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "Andere"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "Unbekannt"
|
||||
},
|
||||
"analytics.value.unmonetized": {
|
||||
"message": "Nicht monetarisiert"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Unsere Desktop App ist für alle Platformen verfügbar. Wähle deine bevorzugte Version."
|
||||
},
|
||||
@@ -555,7 +123,7 @@
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ × ∞ MB"
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
@@ -843,41 +411,26 @@
|
||||
"message": "Private Notiz hinzufügen"
|
||||
},
|
||||
"conversation-thread.action.approve": {
|
||||
"message": "Annehmen"
|
||||
"message": "Genehmigen"
|
||||
},
|
||||
"conversation-thread.action.approve-with-reply": {
|
||||
"message": "Mit Antwort annehmen"
|
||||
"message": "Mit Antwort genehmigen"
|
||||
},
|
||||
"conversation-thread.action.close-thread": {
|
||||
"message": ""
|
||||
},
|
||||
"conversation-thread.action.close-with-reply": {
|
||||
"message": "Mit Antwort schließen"
|
||||
},
|
||||
"conversation-thread.action.reject": {
|
||||
"message": "Ablehnen"
|
||||
},
|
||||
"conversation-thread.action.reject-with-reply": {
|
||||
"message": "Mit Antwort ablehnen"
|
||||
},
|
||||
"conversation-thread.action.reopen-thread": {
|
||||
"message": "Öffne den Thread wieder"
|
||||
},
|
||||
"conversation-thread.action.reply": {
|
||||
"message": "Antworten"
|
||||
},
|
||||
"conversation-thread.action.reply-to-thread": {
|
||||
"message": "Antworte dem Thread"
|
||||
},
|
||||
"conversation-thread.action.resubmit-for-review": {
|
||||
"message": "Erneut zur Überprüfung einreichen"
|
||||
},
|
||||
"conversation-thread.action.send": {
|
||||
"message": "Senden"
|
||||
},
|
||||
"conversation-thread.action.send-to-review": {
|
||||
"message": "Absenden zur Überprüfung"
|
||||
},
|
||||
"conversation-thread.action.withhold": {
|
||||
"message": "Zurückhalten"
|
||||
},
|
||||
@@ -1448,9 +1001,6 @@
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Discord Einladung"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "Links bearbeiten"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.description": {
|
||||
"message": "Ein Ort für Benutzer um Bugs, Probleme und Bedenken über dein Projekt zu melden."
|
||||
},
|
||||
@@ -1475,6 +1025,9 @@
|
||||
"dashboard.projects.links.source-code.label": {
|
||||
"message": "Quellcode"
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.description": {
|
||||
"message": "Eine Seite welche Informationen, Dokumentationen und Hilfe für dein Projekt enthält."
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.label": {
|
||||
"message": "Wikiseite"
|
||||
},
|
||||
@@ -1736,15 +1289,12 @@
|
||||
"discover.install.error.no-server-world": {
|
||||
"message": "Keine Serverwelt ist zur installation verfügbar."
|
||||
},
|
||||
"discover.install.error.unsupported-content-type": {
|
||||
"message": "Diese Art von Inhalt kann nicht vom durchstöbern zu einem Server hinzugefügt werden."
|
||||
},
|
||||
"discover.install.heading.reset-modpack": {
|
||||
"message": "Modpack zum installieren nach dem Reset auswählen"
|
||||
},
|
||||
"discover.seo.title": {
|
||||
"message": "Durchsuche {projectType}"
|
||||
},
|
||||
"discover.seo.title-with-query": {
|
||||
"message": "Durchsuche {projectType} {query}"
|
||||
},
|
||||
"error.collection.404.list_item.1": {
|
||||
"message": "Du hast eventuell die Kollektions-URL falsch geschrieben."
|
||||
},
|
||||
@@ -3084,10 +2634,7 @@
|
||||
"message": "Dein Projekt ist privat, was bedeutet, dass nur du und von dir eingeladene Personen darauf zugreifen können."
|
||||
},
|
||||
"project.moderation.admonition.approved.header": {
|
||||
"message": "Projekt angenommen"
|
||||
},
|
||||
"project.moderation.admonition.draft.header": {
|
||||
"message": "Projektentwurf"
|
||||
"message": "Projekt genehmigt"
|
||||
},
|
||||
"project.moderation.admonition.rejected.header": {
|
||||
"message": "Änderungen angefragt"
|
||||
@@ -3095,30 +2642,15 @@
|
||||
"project.moderation.admonition.under-review.body.1": {
|
||||
"message": "Dein Projekt ist in der Warteschlange, um von Modrinths Moderationsteam überprüft zu werden."
|
||||
},
|
||||
"project.moderation.admonition.under-review.body.5": {
|
||||
"message": "<emphasis>Wir bedanken uns für ihre Geduld während unsere Moderatoren hart dafür arbeiten Modrinth sicher zu halten und wir freuen und ihnen zu helfen ihre Kreationen zu teilen! 💚</emphasis>"
|
||||
},
|
||||
"project.moderation.admonition.under-review.header": {
|
||||
"message": "Projekt wird überprüft"
|
||||
},
|
||||
"project.moderation.admonition.withheld.body": {
|
||||
"message": "Ihr Projekt wird nicht öffentlich anzeigt und kann nur per Direkt Link angezeigt werden.{requestedStatus, select, unlisted { Laut deiner <visibility-settings-link>Anzeige Einstellung</visibility-settings-link>, Ist keine Aktion nötig.} other { Bitte behebe alle Moderationsprobleme, einschließlich aller in den folgenden Nachrichten genannten Punkte, bevor du dieses Projekt erneut einreichst.}}"
|
||||
},
|
||||
"project.moderation.admonition.withheld.header": {
|
||||
"message": "Von Mitarbeitern entlistet"
|
||||
},
|
||||
"project.moderation.error.unauthorized": {
|
||||
"message": "Nicht autorisiert"
|
||||
},
|
||||
"project.moderation.thread.help-center-note.2": {
|
||||
"message": "Falls du Hilfe brauchst oder du hast andere Anfragen, besuche bitte das <help-center-link>Modrinth Hilfe Center</help-center-link> und klicke auf die blaue Sprechblase um den Kundensupport zu kontaktieren."
|
||||
},
|
||||
"project.moderation.thread.moderator-see-user-ui-toggle": {
|
||||
"message": "Zeige Benutzer UI"
|
||||
},
|
||||
"project.moderation.thread.private-description": {
|
||||
"message": "Dies ist eine private Konversation mit den Modrinth Moderatoren. Sie könnten dich bezüglich Problemen im Zusammenhang mit diesem Projekt kontaktieren."
|
||||
},
|
||||
"project.moderation.thread.title": {
|
||||
"message": "Moderationsnachrichten"
|
||||
},
|
||||
@@ -3231,7 +2763,10 @@
|
||||
"message": "Projekt-Dashboard besuchen"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, one {Download} other {Downloads}}"
|
||||
"message": "download{count, plural, one {} other {s}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {Follower} other {Follower}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} wurde archiviert. {title} wird keine weiteren Updates erhalten, es sei denn, der Autor entscheided sich, das Projekt zu Dearchivieren."
|
||||
@@ -3251,21 +2786,12 @@
|
||||
"report.already-reported": {
|
||||
"message": "Du hast bereits {title} gemeldet"
|
||||
},
|
||||
"report.back-to-item": {
|
||||
"message": "Zurück zu {item}"
|
||||
},
|
||||
"report.body.description": {
|
||||
"message": "Füge Links und Bilder hinzu, sofern relevant. Leere oder unzureichender Meldungen werden geschlossen und ignoriert."
|
||||
},
|
||||
"report.body.title": {
|
||||
"message": "Bitte gib weiteren Kontext über deine Meldung"
|
||||
},
|
||||
"report.checking": {
|
||||
"message": "Überprüfe {item}..."
|
||||
},
|
||||
"report.could-not-find": {
|
||||
"message": "Konnte {item} nicht finden"
|
||||
},
|
||||
"report.for.violation": {
|
||||
"message": "Verstoss gegen Modrinth's <rules-link>Regeln</rules-link> oder <terms-link>Nutzungsbedingungen</terms-link>"
|
||||
},
|
||||
@@ -3305,15 +2831,9 @@
|
||||
"report.please-report": {
|
||||
"message": "Bitte melde:"
|
||||
},
|
||||
"report.question.content-id": {
|
||||
"message": "Was ist die ID von dem {item}?"
|
||||
},
|
||||
"report.question.content-type": {
|
||||
"message": "Welche Art an Inhalt meldest du?"
|
||||
},
|
||||
"report.question.report-reason": {
|
||||
"message": "Gegen welche von Modrinths Regeln verstößt dieses {item}?"
|
||||
},
|
||||
"report.report-content": {
|
||||
"message": "Inhalt an Moderatoren melden"
|
||||
},
|
||||
@@ -3426,25 +2946,25 @@
|
||||
"message": "Schreibzugriff Organisationen"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Persönliche Zugriffstoken erstellen"
|
||||
"message": "Peröhnliche API-Token erstellen"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "PATs erstellen"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Deine persönlichen Zugriffstoken löschen"
|
||||
"message": "Persöhnliche API-Token löschen"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "PATs löschen"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Erstellte persönliche Zugriffstoken ansehen"
|
||||
"message": "Erstelle API-Token anzeigen"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "Lesezugriff PATs"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Persönliche Zugriffstoken bearbeiten"
|
||||
"message": "Persöhnliche API-Token bearbeiten"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "Schreibzugriff PATs"
|
||||
@@ -3815,12 +3335,6 @@
|
||||
"settings.account.security.two-factor.description": {
|
||||
"message": "Füge deinem Konto bei der Anmeldung eine zusätzliche Sicherheitsstufe hinzu."
|
||||
},
|
||||
"settings.account.security.two-factor.modal.remove.header": {
|
||||
"message": "2FA entfernen"
|
||||
},
|
||||
"settings.account.security.two-factor.modal.setup.header": {
|
||||
"message": "2FA einrichten"
|
||||
},
|
||||
"settings.account.security.two-factor.title": {
|
||||
"message": "Zwei-Faktor-Authentifizierung"
|
||||
},
|
||||
|
||||
@@ -8,438 +8,6 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Benutzer nicht gefunden"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Hinzufügen"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Abbrechen"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "Aktualisieren"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "Zurücksetzen"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Land"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Downloadgrund"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "Downloadquelle"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Spielversion"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "Auswertung"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetarisierung"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "Keine Auswertung"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Projekt"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Projektstatus"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Projektversion"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "Auswertung nach {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Alle anzeigen"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "Zeige limitierte"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Top 8 anzeigen"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} Std."
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} aktiv"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "Anmerkungen"
|
||||
},
|
||||
"analytics.chart.controls.dialog-aria": {
|
||||
"message": "Analyse Graph Kontrolle"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "Anzeige"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Modrinth Ereignisse"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Keine Modrinth Ereignisse im Graph."
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "Keine Projektereignisse im Graph."
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "Projektereignisse"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "Verhältnis"
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, one {# Analyseereignis} other {# Analyseereignisse}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Ankündigung ansehen"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.aria": {
|
||||
"message": "Zeige monetarisierte Analyse Details"
|
||||
},
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (Vorherige)"
|
||||
},
|
||||
"analytics.chart.render-limit.description": {
|
||||
"message": "Anzeigen aller ausgewählten Zeilen von der Liste könnte die Performance beeinflussen."
|
||||
},
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Alle {count} Zeilen im Graph anzeigen?"
|
||||
},
|
||||
"analytics.chart.table-selection.count": {
|
||||
"message": "Zeige {count} {itemType, select, project {{count, plural, one {project} other {projects}}} country {{count, plural, one {country} other {countries}}} monetization {{count, plural, one {monetization value} other {monetization values}}} downloadSource {{count, plural, one {download source} other {download sources}}} downloadReason {{count, plural, one {download reason} other {download reasons}}} projectVersion {{count, plural, one {project version} other {project versions}}} loader {{count, plural, one {loader} other {loaders}}} gameVersion {{count, plural, one {game version} other {game versions}}} other {{count, plural, one {item} other {items}}}} der Liste"
|
||||
},
|
||||
"analytics.chart.table-selection.limited": {
|
||||
"message": "Zeige {limit} {itemType, select, project {{limit, plural, one {project} other {projects}}} country {{limit, plural, one {country} other {countries}}} monetization {{limit, plural, one {monetization value} other {monetization values}}} downloadSource {{limit, plural, one {download source} other {download sources}}} downloadReason {{limit, plural, one {download reason} other {download reasons}}} projectVersion {{limit, plural, one {project version} other {project versions}}} loader {{limit, plural, one {loader} other {loaders}}} gameVersion {{limit, plural, one {game version} other {game versions}}} other {{limit, plural, one {item} other {items}}}} der Liste"
|
||||
},
|
||||
"analytics.chart.table-selection.top": {
|
||||
"message": "Zeige top {count} {itemType, select, project {{count, plural, one {project} other {projects}}} country {{count, plural, one {country} other {countries}}} monetization {{count, plural, one {monetization value} other {monetization values}}} downloadSource {{count, plural, one {download source} other {download sources}}} downloadReason {{count, plural, one {download reason} other {download reasons}}} projectVersion {{count, plural, one {project version} other {project versions}}} loader {{count, plural, one {loader} other {loaders}}} gameVersion {{count, plural, one {game version} other {game versions}}} other {{count, plural, one {item} other {items}}}} von der Liste"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# Tag} other {# Tage}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# Stunde} other {# Stunden}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, one {# Minute} other {# Minuten}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "{name} im Diagramm ausblenden"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned-aria": {
|
||||
"message": "Angepinnt"
|
||||
},
|
||||
"analytics.chart.tooltip.previous-period-short": {
|
||||
"message": "(Vorherige)"
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "Gesamt"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "Fläche"
|
||||
},
|
||||
"analytics.chart.view.bar": {
|
||||
"message": "Balken"
|
||||
},
|
||||
"analytics.chart.view.line": {
|
||||
"message": "Linie"
|
||||
},
|
||||
"analytics.download-reason.dependency": {
|
||||
"message": "Abhängigkeit"
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "Modpack"
|
||||
},
|
||||
"analytics.download-reason.standalone": {
|
||||
"message": "Eigenständig"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "Aktualisierung"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "Modrinth Website"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "Downloads"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "Keine Daten verfügbar"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "Keine Daten verfügbar für diese Analysen"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "Keine Projekte verfügbar"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "Keine Projekte für die Analyse verfügbar"
|
||||
},
|
||||
"analytics.empty.select-project": {
|
||||
"message": "Wähle mindestens ein Projekt aus um Daten anzuzeigen"
|
||||
},
|
||||
"analytics.filter.game-version-type": {
|
||||
"message": "Spiel Version wählen"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Alle"
|
||||
},
|
||||
"analytics.filter.game-version-type.release": {
|
||||
"message": "Veröffentlichung"
|
||||
},
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Länder durchsuchen..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Download-Quellen durchsuchen..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Projektversionen durchsuchen..."
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "Versionen durchsuchen..."
|
||||
},
|
||||
"analytics.graph.title.downloads": {
|
||||
"message": "Downloads im Laufe der Zeit"
|
||||
},
|
||||
"analytics.graph.title.playtime": {
|
||||
"message": "Spielzeit im Laufe der Zeit"
|
||||
},
|
||||
"analytics.graph.title.revenue": {
|
||||
"message": "Einnahmen im Laufe der Zeit"
|
||||
},
|
||||
"analytics.graph.title.views": {
|
||||
"message": "Ansichten im Laufe der Zeit"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1 Std."
|
||||
},
|
||||
"analytics.group-by.6h": {
|
||||
"message": "6 Std."
|
||||
},
|
||||
"analytics.group-by.date": {
|
||||
"message": "Datum"
|
||||
},
|
||||
"analytics.group-by.day": {
|
||||
"message": "Tag"
|
||||
},
|
||||
"analytics.group-by.month": {
|
||||
"message": "Monat"
|
||||
},
|
||||
"analytics.group-by.selected.day": {
|
||||
"message": "Nach Tag gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.hour": {
|
||||
"message": "Nach Stunde gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.month": {
|
||||
"message": "Nach Monat gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.six-hours": {
|
||||
"message": "Nach 6 Stunden gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.week": {
|
||||
"message": "Nach Woche gruppieren"
|
||||
},
|
||||
"analytics.group-by.selected.year": {
|
||||
"message": "Nach Jahr gruppieren"
|
||||
},
|
||||
"analytics.group-by.week": {
|
||||
"message": "Woche"
|
||||
},
|
||||
"analytics.group-by.year": {
|
||||
"message": "Jahr"
|
||||
},
|
||||
"analytics.loading.fetching-results": {
|
||||
"message": "Ergebnisse werden abgerufen..."
|
||||
},
|
||||
"analytics.options.loading": {
|
||||
"message": "Wird geladen..."
|
||||
},
|
||||
"analytics.project-event.project-approved": {
|
||||
"message": "Projekt angenommen"
|
||||
},
|
||||
"analytics.project-event.project-private": {
|
||||
"message": "Projekt auf Privat gestellt"
|
||||
},
|
||||
"analytics.project-event.project-status-changed": {
|
||||
"message": "Projektstatus geändert"
|
||||
},
|
||||
"analytics.project-event.project-unlisted": {
|
||||
"message": "Projekt entlistet"
|
||||
},
|
||||
"analytics.project-event.version-released": {
|
||||
"message": "{version} veröffentlicht"
|
||||
},
|
||||
"analytics.project-event.version-uploaded": {
|
||||
"message": "Version hochgeladen"
|
||||
},
|
||||
"analytics.project-status.approved": {
|
||||
"message": "Angenommen"
|
||||
},
|
||||
"analytics.project-status.archived": {
|
||||
"message": "Archiviert"
|
||||
},
|
||||
"analytics.project-status.draft": {
|
||||
"message": "Entwurf"
|
||||
},
|
||||
"analytics.project-status.other": {
|
||||
"message": "Andere"
|
||||
},
|
||||
"analytics.project-status.private": {
|
||||
"message": "Privat"
|
||||
},
|
||||
"analytics.project-status.rejected": {
|
||||
"message": "Abgelehnt"
|
||||
},
|
||||
"analytics.project-status.unlisted": {
|
||||
"message": "Nicht gelistet"
|
||||
},
|
||||
"analytics.project-status.withheld": {
|
||||
"message": "Zurückgehalten"
|
||||
},
|
||||
"analytics.project.all": {
|
||||
"message": "Alle Projekte"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# Projekt} other {# Projekte}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name} Icon"
|
||||
},
|
||||
"analytics.project.select": {
|
||||
"message": "Projekte auswählen"
|
||||
},
|
||||
"analytics.query.filter.add": {
|
||||
"message": "Filter hinzufügen"
|
||||
},
|
||||
"analytics.query.label.breakdown": {
|
||||
"message": "Auswertung:"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "Gruppiert nach"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "Projekt:"
|
||||
},
|
||||
"analytics.query.label.timeframe": {
|
||||
"message": "Zeitfenster:"
|
||||
},
|
||||
"analytics.stat.downloads": {
|
||||
"message": "Downloads"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Spielzeit"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} Std."
|
||||
},
|
||||
"analytics.stat.previous-period-comparison": {
|
||||
"message": "im Vergleich zum vorherigen Zeitraum"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison-short": {
|
||||
"message": "im Vergleich zum vorherigen"
|
||||
},
|
||||
"analytics.stat.revenue": {
|
||||
"message": "Einnahmen"
|
||||
},
|
||||
"analytics.stat.revenue-value": {
|
||||
"message": "${value}"
|
||||
},
|
||||
"analytics.stat.unavailable": {
|
||||
"message": "N/A"
|
||||
},
|
||||
"analytics.stat.unavailable-tooltip": {
|
||||
"message": "Statistik nicht verfügbar für aktuellen Filter"
|
||||
},
|
||||
"analytics.stat.views": {
|
||||
"message": "Ansichten"
|
||||
},
|
||||
"analytics.table.csv.date-range": {
|
||||
"message": "{start} bis {end}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Spielzeit (Sekunden)"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, one {# Tag} other {# Tage}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, one {# Stunde} other {# Stunden}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, one {# Minute} other {# Minuten}}"
|
||||
},
|
||||
"analytics.table.export-csv": {
|
||||
"message": "CSV exportieren"
|
||||
},
|
||||
"analytics.table.export.cumulative": {
|
||||
"message": "Kumulativ"
|
||||
},
|
||||
"analytics.table.export.grouped": {
|
||||
"message": "Gruppiert nach {groupBy}"
|
||||
},
|
||||
"analytics.table.pagination.summary": {
|
||||
"message": "{start} bis {end} von {total} werden angezeigt"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Suchen..."
|
||||
},
|
||||
"analytics.threshold.countries-above": {
|
||||
"message": "Länder über"
|
||||
},
|
||||
"analytics.threshold.country-downloads-aria": {
|
||||
"message": "Schwellenwert für Downloads nach Land"
|
||||
},
|
||||
"analytics.threshold.game-version-downloads-aria": {
|
||||
"message": "Schwellenwert für Downloads von Spielversionen"
|
||||
},
|
||||
"analytics.threshold.game-versions-above": {
|
||||
"message": "Spielversionen über"
|
||||
},
|
||||
"analytics.threshold.project-downloads-aria": {
|
||||
"message": "Schwellenwert für Projekt-Downloads"
|
||||
},
|
||||
"analytics.threshold.project-version-downloads-aria": {
|
||||
"message": "Schwellenwert für Projektversionen-Downloads"
|
||||
},
|
||||
"analytics.threshold.project-versions-above": {
|
||||
"message": "Projektversionen über"
|
||||
},
|
||||
"analytics.threshold.projects-above": {
|
||||
"message": "Projekte über"
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "Analysen"
|
||||
},
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetarisiert"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Keine"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "Andere"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "Unbekannt"
|
||||
},
|
||||
"analytics.value.unmonetized": {
|
||||
"message": "Nicht monetarisiert"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Unsere Desktop-App ist auf allen Plattformen verfügbar. Wähle einfach deine gewünschte Version."
|
||||
},
|
||||
@@ -555,7 +123,7 @@
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ × ∞ MB"
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
@@ -843,41 +411,26 @@
|
||||
"message": "Private Notiz hinzufügen"
|
||||
},
|
||||
"conversation-thread.action.approve": {
|
||||
"message": "Annehmen"
|
||||
"message": "Genehmigen"
|
||||
},
|
||||
"conversation-thread.action.approve-with-reply": {
|
||||
"message": "Mit Antwort annehmen"
|
||||
"message": "Mit Antwort genehmigen"
|
||||
},
|
||||
"conversation-thread.action.close-thread": {
|
||||
"message": ""
|
||||
},
|
||||
"conversation-thread.action.close-with-reply": {
|
||||
"message": "Mit Antwort schließen"
|
||||
},
|
||||
"conversation-thread.action.reject": {
|
||||
"message": "Ablehnen"
|
||||
},
|
||||
"conversation-thread.action.reject-with-reply": {
|
||||
"message": "Mit Antwort ablehnen"
|
||||
},
|
||||
"conversation-thread.action.reopen-thread": {
|
||||
"message": "Öffne den Thread wieder"
|
||||
},
|
||||
"conversation-thread.action.reply": {
|
||||
"message": "Antworten"
|
||||
},
|
||||
"conversation-thread.action.reply-to-thread": {
|
||||
"message": "Antworte dem Thread"
|
||||
},
|
||||
"conversation-thread.action.resubmit-for-review": {
|
||||
"message": "Erneut zur Überprüfung einreichen"
|
||||
},
|
||||
"conversation-thread.action.send": {
|
||||
"message": "Senden"
|
||||
},
|
||||
"conversation-thread.action.send-to-review": {
|
||||
"message": "Absenden zur Überprüfung"
|
||||
},
|
||||
"conversation-thread.action.withhold": {
|
||||
"message": "Zurückhalten"
|
||||
},
|
||||
@@ -1032,7 +585,7 @@
|
||||
"message": "URL"
|
||||
},
|
||||
"create.project.visibility-description": {
|
||||
"message": "Die Sichtbarkeit deines Projekts, nachdem es angenommen wurde."
|
||||
"message": "Die Sichtbarkeit deines Projekts, nachdem es genehmigt wurde."
|
||||
},
|
||||
"create.project.visibility-private": {
|
||||
"message": "Privat"
|
||||
@@ -1448,9 +1001,6 @@
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Discord-Einladung"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "Links bearbeiten"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.description": {
|
||||
"message": "Ein Ort, an dem Nutzer Fehler, Probleme und Bedenken zu deinem Projekt melden können."
|
||||
},
|
||||
@@ -1475,6 +1025,9 @@
|
||||
"dashboard.projects.links.source-code.label": {
|
||||
"message": "Quellcode"
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.description": {
|
||||
"message": "Eine Seite mit Informationen, Dokumentation und Hilfe zum Projekt."
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.label": {
|
||||
"message": "Wikiseite"
|
||||
},
|
||||
@@ -1736,15 +1289,12 @@
|
||||
"discover.install.error.no-server-world": {
|
||||
"message": "Keine Serverwelt ist zur Installation verfügbar."
|
||||
},
|
||||
"discover.install.error.unsupported-content-type": {
|
||||
"message": "Dieser Inhaltstyp kann nicht vom Durchstöbern zu einem Server hinzugefügt werden."
|
||||
},
|
||||
"discover.install.heading.reset-modpack": {
|
||||
"message": "Modpack zur Installation nach dem Zurücksetzen auswählen"
|
||||
},
|
||||
"discover.seo.title": {
|
||||
"message": "Durchsuche {projectType}"
|
||||
},
|
||||
"discover.seo.title-with-query": {
|
||||
"message": "Durchsuche {projectType} {query}"
|
||||
},
|
||||
"error.collection.404.list_item.1": {
|
||||
"message": "Eventuell hast du die URL der Kollektion falsch eingegeben."
|
||||
},
|
||||
@@ -3084,10 +2634,7 @@
|
||||
"message": "Dein Projekt ist privat, was bedeutet, dass nur du und von dir eingeladene Personen darauf zugreifen können."
|
||||
},
|
||||
"project.moderation.admonition.approved.header": {
|
||||
"message": "Projekt angenommen"
|
||||
},
|
||||
"project.moderation.admonition.draft.header": {
|
||||
"message": "Projektentwurf"
|
||||
"message": "Projekt genehmigt"
|
||||
},
|
||||
"project.moderation.admonition.rejected.header": {
|
||||
"message": "Änderungen angefragt"
|
||||
@@ -3095,30 +2642,15 @@
|
||||
"project.moderation.admonition.under-review.body.1": {
|
||||
"message": "Dein Projekt ist in der Warteschlange, um von Modrinths Moderationsteam überprüft zu werden."
|
||||
},
|
||||
"project.moderation.admonition.under-review.body.5": {
|
||||
"message": "<emphasis>Wir bedanken uns für ihre Geduld während unsere Moderatoren hart dafür arbeiten Modrinth sicher zu halten und wir freuen und ihnen zu helfen ihre Kreationen zu teilen! 💚</emphasis>"
|
||||
},
|
||||
"project.moderation.admonition.under-review.header": {
|
||||
"message": "Projekt wird überprüft"
|
||||
},
|
||||
"project.moderation.admonition.withheld.body": {
|
||||
"message": "Ihr Projekt wird nicht öffentlich anzeigt und kann nur per Direkt Link angezeigt werden.{requestedStatus, select, unlisted { Laut deiner <visibility-settings-link>Anzeige Einstellung</visibility-settings-link>, Ist keine Aktion nötig.} other { Bitte behebe alle Moderationsprobleme, einschließlich aller in den folgenden Nachrichten genannten Punkte, bevor du dieses Projekt erneut einreichst.}}"
|
||||
},
|
||||
"project.moderation.admonition.withheld.header": {
|
||||
"message": "Von Mitarbeitern entlistet"
|
||||
},
|
||||
"project.moderation.error.unauthorized": {
|
||||
"message": "Nicht autorisiert"
|
||||
},
|
||||
"project.moderation.thread.help-center-note.2": {
|
||||
"message": "Falls du Hilfe brauchst oder du hast andere Anfragen, besuche bitte das <help-center-link>Modrinth Hilfe Center</help-center-link> und klicke auf die blaue Sprechblase um den Kundensupport zu kontaktieren."
|
||||
},
|
||||
"project.moderation.thread.moderator-see-user-ui-toggle": {
|
||||
"message": "Zeige Benutzer UI"
|
||||
},
|
||||
"project.moderation.thread.private-description": {
|
||||
"message": "Dies ist eine private Konversation mit den Modrinth Moderatoren. Sie könnten dich bezüglich Problemen im Zusammenhang mit diesem Projekt kontaktieren."
|
||||
},
|
||||
"project.moderation.thread.title": {
|
||||
"message": "Moderationsnachrichten"
|
||||
},
|
||||
@@ -3231,7 +2763,10 @@
|
||||
"message": "Projekt-Dashboard besuchen"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, one {Download} other {Downloads}}"
|
||||
"message": "Download{count, plural, one {} other {s}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {Follower} other {Follower}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} wurde archiviert. {title} wird keine weiteren Updates erhalten, es sei denn, der Autor entscheidet sich das Projekt zu dearchivieren."
|
||||
@@ -3251,21 +2786,12 @@
|
||||
"report.already-reported": {
|
||||
"message": "Du hast {title} bereits gemeldet"
|
||||
},
|
||||
"report.back-to-item": {
|
||||
"message": "Zurück zu {item}"
|
||||
},
|
||||
"report.body.description": {
|
||||
"message": "Füge nach Möglichkeit und Relevanz Links und Bilder ein. Leere oder unzureichende Meldungen werden geschlossen und ignoriert."
|
||||
},
|
||||
"report.body.title": {
|
||||
"message": "Bitte gib weiteren Kontext über deine Meldung"
|
||||
},
|
||||
"report.checking": {
|
||||
"message": "Überprüfe {item}..."
|
||||
},
|
||||
"report.could-not-find": {
|
||||
"message": "Konnte {item} nicht finden"
|
||||
},
|
||||
"report.for.violation": {
|
||||
"message": "Verstoß gegen Modrinths <rules-link>Regeln</rules-link> oder <terms-link>Nutzungsbedingungen</terms-link>"
|
||||
},
|
||||
@@ -3305,15 +2831,9 @@
|
||||
"report.please-report": {
|
||||
"message": "Bitte melde:"
|
||||
},
|
||||
"report.question.content-id": {
|
||||
"message": "Was ist die ID von dem {item}?"
|
||||
},
|
||||
"report.question.content-type": {
|
||||
"message": "Welche Art an Inhalt möchtest du melden?"
|
||||
},
|
||||
"report.question.report-reason": {
|
||||
"message": "Gegen welche von Modrinths Regeln verstößt dieses {item}?"
|
||||
},
|
||||
"report.report-content": {
|
||||
"message": "Inhalt den Moderatoren melden"
|
||||
},
|
||||
@@ -3426,25 +2946,25 @@
|
||||
"message": "Organisationen bearbeiten"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Persönliche Zugriffstoken erstellen"
|
||||
"message": "Persönliche API-Tokens erstellen"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "PATs erstellen"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Deine persönlichen Zugriffstoken löschen"
|
||||
"message": "Deine persönlichen API-Tokens löschen"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "PATs löschen"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Erstellte persönliche Zugriffstoken ansehen"
|
||||
"message": "Erstellte API-Tokens einsehen"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "PATs einsehen"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Persönliche Zugriffstoken bearbeiten"
|
||||
"message": "Persönliche API-Tokens bearbeiten"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "PATs bearbeiten"
|
||||
@@ -3815,12 +3335,6 @@
|
||||
"settings.account.security.two-factor.description": {
|
||||
"message": "Füge deinem Konto bei der Anmeldung eine zusätzliche Sicherheitsstufe hinzu."
|
||||
},
|
||||
"settings.account.security.two-factor.modal.remove.header": {
|
||||
"message": "2FA entfernen"
|
||||
},
|
||||
"settings.account.security.two-factor.modal.setup.header": {
|
||||
"message": "2FA einrichten"
|
||||
},
|
||||
"settings.account.security.two-factor.title": {
|
||||
"message": "Zwei-Faktor-Authentifizierung"
|
||||
},
|
||||
|
||||
@@ -368,15 +368,6 @@
|
||||
"analytics.stat.downloads": {
|
||||
"message": "Downloads"
|
||||
},
|
||||
"analytics.stat.monetization-banner.body": {
|
||||
"message": "Only views and downloads made through Modrinth are eligible for monetization and must pass fraud-prevention filtering. Modrinth App downloads also require the user to be logged in. Because all projects have a similar ratio of monetized downloads, your revenue would not meaningfully change if all downloads were counted."
|
||||
},
|
||||
"analytics.stat.monetization-banner.learn-more": {
|
||||
"message": "Learn more"
|
||||
},
|
||||
"analytics.stat.monetization-banner.title": {
|
||||
"message": "How does monetization work?"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Playtime"
|
||||
},
|
||||
@@ -1953,7 +1944,7 @@
|
||||
"message": "Frog"
|
||||
},
|
||||
"hosting-marketing.available-locations": {
|
||||
"message": "Available in North America, Europe, Southeast Asia, and Australia for wide coverage."
|
||||
"message": "Available in North America, Europe, and Southeast Asia for wide coverage."
|
||||
},
|
||||
"hosting-marketing.billing.monthly": {
|
||||
"message": "Pay monthly"
|
||||
@@ -2016,7 +2007,7 @@
|
||||
"message": "Where are Modrinth Hosting servers located? Can I choose a region?"
|
||||
},
|
||||
"hosting-marketing.faq.location.answer": {
|
||||
"message": "We have servers available across North America, Europe, Southeast Asia, and Australia at the moment that you can choose upon purchase. More regions to come in the future! If you'd like to switch your region, please contact support."
|
||||
"message": "We have servers available across North America, Europe, and Southeast Asia at the moment that you can choose upon purchase. More regions to come in the future! If you'd like to switch your region, please contact support."
|
||||
},
|
||||
"hosting-marketing.faq.versions-loaders": {
|
||||
"message": "What Minecraft versions and loaders can be used?"
|
||||
|
||||
@@ -8,258 +8,6 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Usuario no encontrado"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Añadir"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Cancelar"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "Refrescar"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "Restablecer"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "País"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Versión del juego"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "Desglose"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetización"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "Sin desglose"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Proyecto"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Estado del proyecto"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Versión del proyecto"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "Desglosar por {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Mostrar todos"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Mostrar los primeros 8"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} h"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Eventos de Modrinth"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Sin eventos de modrinth en la gráfica."
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "Sin eventos del proyecto en la gráfica."
|
||||
},
|
||||
"analytics.chart.controls.previous-period": {
|
||||
"message": "Período anterior"
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "Eventos del proyecto"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# día} other {# días}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# hora} other {# horas}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural,one {# minuto} other {# minutos}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Ocultar {name} en la gráfica"
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "Total"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "Área"
|
||||
},
|
||||
"analytics.chart.view.bar": {
|
||||
"message": "Barra"
|
||||
},
|
||||
"analytics.chart.view.line": {
|
||||
"message": "Línea"
|
||||
},
|
||||
"analytics.download-reason.dependency": {
|
||||
"message": "Dependencia"
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "Modpack"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "Página de Modrinth"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "descargas"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "No hay datos disponibles"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Todo"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1h"
|
||||
},
|
||||
"analytics.group-by.6h": {
|
||||
"message": "6h"
|
||||
},
|
||||
"analytics.group-by.date": {
|
||||
"message": "Fecha"
|
||||
},
|
||||
"analytics.group-by.day": {
|
||||
"message": "Día"
|
||||
},
|
||||
"analytics.group-by.month": {
|
||||
"message": "Mes"
|
||||
},
|
||||
"analytics.group-by.selected.day": {
|
||||
"message": "Agrupar por día"
|
||||
},
|
||||
"analytics.group-by.selected.hour": {
|
||||
"message": "Agrupar por hora"
|
||||
},
|
||||
"analytics.group-by.selected.month": {
|
||||
"message": "Agrupar por mes"
|
||||
},
|
||||
"analytics.group-by.selected.six-hours": {
|
||||
"message": "Agrupar por 6 horas"
|
||||
},
|
||||
"analytics.group-by.selected.week": {
|
||||
"message": "Agrupar por semana"
|
||||
},
|
||||
"analytics.group-by.selected.year": {
|
||||
"message": "Agrupar por año"
|
||||
},
|
||||
"analytics.group-by.week": {
|
||||
"message": "Semana"
|
||||
},
|
||||
"analytics.group-by.year": {
|
||||
"message": "Año"
|
||||
},
|
||||
"analytics.loading.fetching-results": {
|
||||
"message": "Obteniendo resultados..."
|
||||
},
|
||||
"analytics.options.loading": {
|
||||
"message": "Cargando..."
|
||||
},
|
||||
"analytics.project-status.approved": {
|
||||
"message": "Aprobado"
|
||||
},
|
||||
"analytics.project-status.archived": {
|
||||
"message": "Archivado"
|
||||
},
|
||||
"analytics.project-status.draft": {
|
||||
"message": "Borrador"
|
||||
},
|
||||
"analytics.project-status.other": {
|
||||
"message": "Otro"
|
||||
},
|
||||
"analytics.project-status.private": {
|
||||
"message": "Privado"
|
||||
},
|
||||
"analytics.project-status.rejected": {
|
||||
"message": "Rechazado"
|
||||
},
|
||||
"analytics.project-status.unlisted": {
|
||||
"message": "No listado"
|
||||
},
|
||||
"analytics.project-status.withheld": {
|
||||
"message": "Retenido"
|
||||
},
|
||||
"analytics.project.all": {
|
||||
"message": "Todos los proyectos"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# proyecto} other {# proyectos}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "{name} Icono"
|
||||
},
|
||||
"analytics.query.filter.add": {
|
||||
"message": "Añadir filtro"
|
||||
},
|
||||
"analytics.query.label.breakdown": {
|
||||
"message": "Desglose:"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "Agrupado por"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "Proyecto:"
|
||||
},
|
||||
"analytics.query.label.timeframe": {
|
||||
"message": "Plazo:"
|
||||
},
|
||||
"analytics.stat.downloads": {
|
||||
"message": "Descargas"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Tiempo de juego"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} hrs"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison": {
|
||||
"message": "vs. período anterior"
|
||||
},
|
||||
"analytics.stat.revenue": {
|
||||
"message": "Ingresos"
|
||||
},
|
||||
"analytics.stat.revenue-value": {
|
||||
"message": "${value}"
|
||||
},
|
||||
"analytics.stat.unavailable": {
|
||||
"message": "N/A"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Tiempo de juego (segundos)"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, one {# día} other {# días}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, one {# hora} other {# horas}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, one {# minuto} other {# minutos}}"
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "Estadísticas"
|
||||
},
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monetizado"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "Otro"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "Desconocido"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Nuestra aplicación de escritorio está disponible en todas las plataformas, elige la versión que prefieras."
|
||||
},
|
||||
@@ -375,7 +123,7 @@
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ × ∞ MB"
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
@@ -735,7 +483,7 @@
|
||||
"message": "Envía un mensaje..."
|
||||
},
|
||||
"conversation-thread.reply-modal.confirmation.description": {
|
||||
"message": "Confirmación de que moderadores no monitorean esto activamente"
|
||||
"message": "Confirmación que moderadores no monitorean esto activamente"
|
||||
},
|
||||
"conversation-thread.reply-modal.confirmation.label": {
|
||||
"message": "Comprendo que los moderadores no monitorean este hilo activamente."
|
||||
@@ -1257,7 +1005,7 @@
|
||||
"message": "¡Haz una organización!"
|
||||
},
|
||||
"dashboard.organizations.error.fetch": {
|
||||
"message": "Error al cargar las organizaciones"
|
||||
"message": "Fallo en obtener las organizaciones"
|
||||
},
|
||||
"dashboard.organizations.member-count": {
|
||||
"message": "{count} {count, plural,one {miembro} other {miembros}}"
|
||||
@@ -1272,7 +1020,7 @@
|
||||
"message": "Ver historial"
|
||||
},
|
||||
"dashboard.overview.notifications.empty.no-unread": {
|
||||
"message": "No tienes ningúna notificación sin leer."
|
||||
"message": "No tienes notificaciones sin leer."
|
||||
},
|
||||
"dashboard.overview.notifications.error.loading": {
|
||||
"message": "Error cargando notificaciones:"
|
||||
@@ -1311,7 +1059,7 @@
|
||||
"message": "Los cambios se aplicaran en <strong>{count}</strong>{count, plural,one {proyecto}other {proyectos}}."
|
||||
},
|
||||
"dashboard.projects.links.description": {
|
||||
"message": "Cualquier enlace que escribas a continuación se modificará en los proyectos seleccionados. Los que dejes en blanco se ignorarán. Puedes quitar un enlace de todos los proyectos seleccionados usando el botón de la papelera."
|
||||
"message": "Cualquier enlace escrito más abajo se modificará en los proyectos seleccionados. Los que dejes en blanco serán ignorados. Puedes quitar un enlace de todos los proyectos seleccionados usando el botón de basurero."
|
||||
},
|
||||
"dashboard.projects.links.discord-invite.description": {
|
||||
"message": "Una invitación a tu servidor de Discord."
|
||||
@@ -1319,11 +1067,8 @@
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Invitación de Discord"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "Editar enlaces"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.description": {
|
||||
"message": "Un lugar para que los usuarios reporten bugs, errores, y preocupaciones sobre tu proyecto."
|
||||
"message": "Un lugar donde los usuarios reporten errores, problemas y preocupaciones sobre tu proyecto."
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.label": {
|
||||
"message": "Registro de errores"
|
||||
@@ -1346,6 +1091,9 @@
|
||||
"dashboard.projects.links.source-code.label": {
|
||||
"message": "Código fuente"
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.description": {
|
||||
"message": "Una página que contenga información y documentación que ayude al proyecto."
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.label": {
|
||||
"message": "Página wiki"
|
||||
},
|
||||
@@ -1599,7 +1347,7 @@
|
||||
"message": "Volver al servidor"
|
||||
},
|
||||
"discover.install.back-to-setup": {
|
||||
"message": "Volver a configuración"
|
||||
"message": "Volver al setup"
|
||||
},
|
||||
"discover.install.cancel-reset": {
|
||||
"message": "Cancelar reinicio"
|
||||
@@ -1607,6 +1355,9 @@
|
||||
"discover.install.error.no-server-world": {
|
||||
"message": "No hay mundos de servidores disponibles para la instalación."
|
||||
},
|
||||
"discover.install.error.unsupported-content-type": {
|
||||
"message": "Este tipo de contenido no puede ser instalado a un servidor por búsqueda."
|
||||
},
|
||||
"discover.install.heading.reset-modpack": {
|
||||
"message": "Seleccionando modpack para instalar antes del reinicio"
|
||||
},
|
||||
@@ -1776,7 +1527,7 @@
|
||||
"message": "¿Dónde se encuentran los servidores de Modrinth Hosting? ¿Puedo elegir una región?"
|
||||
},
|
||||
"hosting-marketing.faq.location.answer": {
|
||||
"message": "Tenemos servidores disponibles a través de Norteamérica, Europa y el sudeste asiático que puedes seleccionar en el momento de tu compra. ¡Se añadirán más regiones en el futuro! Si deseas cambiar tu región, por favor contacta con soporte."
|
||||
"message": "Tenemos servidores disponibles a través de Norteamérica, Europa y el sudeste asiático que puedes seleccionar en el momento de tu compra. ¡Más regiones en el futuro! Si deseas cambiar tu región, por favor contacta con soporte."
|
||||
},
|
||||
"hosting-marketing.faq.versions-loaders": {
|
||||
"message": "¿Qué versiones y loaders de Minecraft se pueden utilizar?"
|
||||
@@ -2120,9 +1871,6 @@
|
||||
"layout.banner.build-fail.title": {
|
||||
"message": "Error al generar el estado desde la API durante la compilación."
|
||||
},
|
||||
"layout.banner.preview.description": {
|
||||
"message": "Si buscas acceder al sitio oficial de Modrinth visita {url}. Este sitio de previsualización es usado por el staff de Modrinth para fines de pruebas. Fue creado usando {ref}."
|
||||
},
|
||||
"layout.banner.preview.title": {
|
||||
"message": "Esta es una vista previa de la implementación del sitio web de Modrinth."
|
||||
},
|
||||
@@ -2145,7 +1893,7 @@
|
||||
"message": "Completar formulario fiscal"
|
||||
},
|
||||
"layout.banner.tax.description": {
|
||||
"message": "Ya has retirado más de {threshold} de Modrinth este año. Para cumplir con las regulaciones fiscales, necesitas llenar un formulario fiscal. Tus retiros estarán en pausa hasta que envíes el formulario."
|
||||
"message": "Ya has retirado más de {threshold} de Modrinth este año. Para cumplir con las regulaciones fiscales, es necesario que completes un formulario de impuestos. Tus retiros estarán pausados hasta que dicho formulario sea enviado."
|
||||
},
|
||||
"layout.banner.tax.title": {
|
||||
"message": "Formulario fiscal requerido"
|
||||
@@ -2529,7 +2277,7 @@
|
||||
"message": "Introduce tu correo electrónico de PIX"
|
||||
},
|
||||
"muralpay.placeholder.enter-random-key": {
|
||||
"message": "Introduce la clave aleatoria"
|
||||
"message": "Introducir clave aleatoria"
|
||||
},
|
||||
"muralpay.placeholder.enter-routing-number": {
|
||||
"message": "Introduce el número de ruta de 9 dígitos"
|
||||
@@ -2690,9 +2438,6 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} - Descarga proyectos de {username} en Modrinth"
|
||||
},
|
||||
"profile.official-account": {
|
||||
"message": "Cuenta oficial de Modrinth"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, one {<stat>{count}</stat> seguidor del proyecto} other {<stat>{count}</stat> seguidores del proyecto}}"
|
||||
},
|
||||
@@ -2970,10 +2715,10 @@
|
||||
"message": "Proyecto aprobado"
|
||||
},
|
||||
"project.moderation.admonition.draft.body": {
|
||||
"message": "Este es un borrador del proyecto que no podrá ser visto por otros hasta que se envíe para ser revisado y aprobado por el equipo de moderación de Modrinth."
|
||||
"message": "Este es un borrador de tu proyecto que nadie puede ver hasta que sea enviado para ser revisado y aprobado por el equipo de moderación de Modrinth."
|
||||
},
|
||||
"project.moderation.admonition.draft.header": {
|
||||
"message": "Borrador del proyecto"
|
||||
"message": "Borrador"
|
||||
},
|
||||
"project.moderation.admonition.draft.submit-for-review": {
|
||||
"message": "Una vez que hayas completado todos los pasos necesarios y te hayas asegurado de que tu proyecto cumple con las <rules-link>Reglas de contenido</rules-link> de Modrinth, puedes enviar tu proyecto a revisión."
|
||||
@@ -2997,10 +2742,10 @@
|
||||
"message": "Aún puedes modificar tu proyecto, no afectará tu posición en la cola."
|
||||
},
|
||||
"project.moderation.admonition.under-review.body.4": {
|
||||
"message": "Nuestro objetivo es revisar envíos en un plazo de 24-48 horas, pero algunos proyectos pueden sufrir retrasos. Esto no indica que haya algún problema con tu envío."
|
||||
"message": "Buscamos revisar envíos en un plazo de 24-48 horas, pero algunos proyectos pueden sufrir retrasos. Esto no indica ningún problema con tu envío."
|
||||
},
|
||||
"project.moderation.admonition.under-review.body.5": {
|
||||
"message": "<emphasis>¡Apreciamos tu paciencia mientras nuestros moderadores trabajan duro para mantener Modrinth seguro, y estaremos encantados de poder ayudarte a compartir tu contenido! 💚</emphasis>"
|
||||
"message": "<emphasis>¡Apreciamos tu paciencia mientras nuestros moderadores trabajan duro para mantener Modrinth seguro y estaremos encantados de poder ayudarte a compartir tu contenido! 💚</emphasis>"
|
||||
},
|
||||
"project.moderation.admonition.under-review.header": {
|
||||
"message": "Proyecto bajo revisión"
|
||||
@@ -3024,10 +2769,10 @@
|
||||
"message": "Si necesitas ayuda o tienes consultas adicionales, por favor visita el <help-center-link>Centro de ayuda de Modrinth</help-center-link> y haz click en la burbuja azúl para contactar con soporte."
|
||||
},
|
||||
"project.moderation.thread.moderator-see-user-ui-toggle": {
|
||||
"message": "Mostrar interfaz de miembros"
|
||||
"message": "Mostrar vista de miembro"
|
||||
},
|
||||
"project.moderation.thread.private-description": {
|
||||
"message": "Este es un hilo de conversación con los moderadores de Modrinth. Es posible que te envíen mensajes sobre cuestiones relacionadas con este proyecto."
|
||||
"message": "Este es un hilo de conversación con los moderadores de Modrinth. Podrían enviarte un mensaje con observaciones relacionadas a este proyecto."
|
||||
},
|
||||
"project.moderation.thread.title": {
|
||||
"message": "Mensajes de moredación"
|
||||
@@ -3096,10 +2841,10 @@
|
||||
"message": "URL"
|
||||
},
|
||||
"project.settings.permissions.attention-needed.description.proj-approved": {
|
||||
"message": "Por favor, proporciona pruebas de que tienes permiso para redistribuir todos estos archivos y cualquier versión retenida se publicará automáticamente."
|
||||
"message": "Por favor proporciona pruebas de que tienes permiso para redistribuir todos estos archivos y cualquier versión retenida se publicará automáticamente."
|
||||
},
|
||||
"project.settings.permissions.attention-needed.description.proj-draft": {
|
||||
"message": "Por favor, proporciona pruebas de que tienes permiso para redistribuir todos estos archivos antes de enviar tu proyecto a revisión."
|
||||
"message": "Por favor proporciona pruebas de que tienes permiso para redistribuir todos estos archivos antes de enviar tu proyecto a revisión."
|
||||
},
|
||||
"project.settings.permissions.attention-needed.title": {
|
||||
"message": "Incluye contenido desconocido"
|
||||
@@ -3123,13 +2868,13 @@
|
||||
"message": "No se puede incluir parte del contenido"
|
||||
},
|
||||
"project.settings.permissions.info-banner.description": {
|
||||
"message": "Si incluyes contenido que no está alojado en Modrinth, debes indicarnos de dónde es y verificar que tienes permiso para distribuir los archivos. ¡Mira <link>nuestra guía</link> para saber cómo hacerlo correctamente!"
|
||||
"message": "Si incluyes contenido que no está en Modrinth, debes dejarnos saber de donde es y verificar que tienes permiso de distribuir los archivos. ¡Mira <link>nuestra guía</link> para aprender como hacerlo!"
|
||||
},
|
||||
"project.settings.permissions.info-banner.title": {
|
||||
"message": "Aprende cómo funcionan las atribuciones"
|
||||
},
|
||||
"project.settings.permissions.learn-more": {
|
||||
"message": "Aprender más"
|
||||
"message": "Aprende más"
|
||||
},
|
||||
"project.settings.permissions.search-placeholder": {
|
||||
"message": "Busca {count} {count, plural, one {proyecto externo} other {proyectos externos}}..."
|
||||
@@ -3141,10 +2886,10 @@
|
||||
"message": "Ver el panel de control de proyectos"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, one {descarga} other {descargas}}"
|
||||
"message": "descarga{count, plural, one {} other {s}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {seguidor} other {seguidores}}"
|
||||
"message": "seguidor{count, plural, one {} other {es}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} se ha archivado. {title} no recibirá más actualizaciones hasta que el autor decida desarchivar el proyecto."
|
||||
@@ -3153,7 +2898,7 @@
|
||||
"message": "Versiones"
|
||||
},
|
||||
"project.versions.withheld-versions-warning.description": {
|
||||
"message": "{count, plural, one {Esta versión está retenida y no listada} other {Estas versiones están retenidas y no listadas}} públicamente. Por favor, proporciona pruebas de que tienes permiso para redistribuir algunos de los archivos incluidos en {count, plural, one {la versión} other {las versiones}} del modpack."
|
||||
"message": "{count, plural, one {Esta versión se encuentra retenida y no listada} other {Estas versiones se encuentran retenidas y no listadas}} publicamente. Por favor proporcione pruebas que tiene permiso de redistribuir algunos de los archivos presentes en {count, plural, one {la versión} other {las versiones}} del modpack."
|
||||
},
|
||||
"project.versions.withheld-versions-warning.resolve-button": {
|
||||
"message": "Resolver"
|
||||
@@ -3225,7 +2970,7 @@
|
||||
"message": "Accede a tus datos analíticos"
|
||||
},
|
||||
"scopes.analytics.label": {
|
||||
"message": "Ver estadísticas"
|
||||
"message": "Consultar estadísticas"
|
||||
},
|
||||
"scopes.category.analytics": {
|
||||
"message": "Estadísticas"
|
||||
@@ -3276,10 +3021,10 @@
|
||||
"message": "Eliminar colecciones"
|
||||
},
|
||||
"scopes.collectionRead.description": {
|
||||
"message": "Ver colecciones"
|
||||
"message": "Consultar colecciones"
|
||||
},
|
||||
"scopes.collectionRead.label": {
|
||||
"message": "Ver colecciones"
|
||||
"message": "Consultar colecciones"
|
||||
},
|
||||
"scopes.collectionWrite.description": {
|
||||
"message": "Escribir en colecciones"
|
||||
@@ -3288,13 +3033,13 @@
|
||||
"message": "Escribir colecciones"
|
||||
},
|
||||
"scopes.notificationRead.description": {
|
||||
"message": "Ver tus notificaciones"
|
||||
"message": "Leer sus notificaciones"
|
||||
},
|
||||
"scopes.notificationRead.label": {
|
||||
"message": "Ver notificaciones"
|
||||
"message": "Leer notificaciones"
|
||||
},
|
||||
"scopes.notificationWrite.description": {
|
||||
"message": "Elimina/Ve tus notificaciones"
|
||||
"message": "Eliminar/Ver sus notificaciones"
|
||||
},
|
||||
"scopes.notificationWrite.label": {
|
||||
"message": "Escribir notificaciones"
|
||||
@@ -3312,10 +3057,10 @@
|
||||
"message": "Eliminar organizaciones"
|
||||
},
|
||||
"scopes.organizationRead.description": {
|
||||
"message": "Ver organizaciones"
|
||||
"message": "Consultar organizaciones"
|
||||
},
|
||||
"scopes.organizationRead.label": {
|
||||
"message": "Ver organizaciones"
|
||||
"message": "Consultar organizaciones"
|
||||
},
|
||||
"scopes.organizationWrite.description": {
|
||||
"message": "Escribir en organizaciones"
|
||||
@@ -3323,15 +3068,27 @@
|
||||
"scopes.organizationWrite.label": {
|
||||
"message": "Escribir organizaciones"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Crear tokens de API personales"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "Crear PATs"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Eliminar tus tokens de API personales"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "Eliminar PATs"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Ver tokens de API creados"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "Consultar PATs"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Editar tokens de API personales"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "Escribir PATs"
|
||||
},
|
||||
@@ -3366,10 +3123,10 @@
|
||||
"message": "Eliminar proyectos"
|
||||
},
|
||||
"scopes.projectRead.description": {
|
||||
"message": "Ver todos tus proyectos"
|
||||
"message": "Consultar todos tus proyectos"
|
||||
},
|
||||
"scopes.projectRead.label": {
|
||||
"message": "Ver proyectos"
|
||||
"message": "Consultar proyectos"
|
||||
},
|
||||
"scopes.projectWrite.description": {
|
||||
"message": "Escribir datos del proyecto"
|
||||
@@ -3390,10 +3147,10 @@
|
||||
"message": "Eliminar reportes"
|
||||
},
|
||||
"scopes.reportRead.description": {
|
||||
"message": "Ver reportes"
|
||||
"message": "Leer reportes"
|
||||
},
|
||||
"scopes.reportRead.label": {
|
||||
"message": "Ver reportes"
|
||||
"message": "Leer reportes"
|
||||
},
|
||||
"scopes.reportWrite.description": {
|
||||
"message": "Editar reportes"
|
||||
@@ -3432,7 +3189,7 @@
|
||||
"message": "Crear hilos"
|
||||
},
|
||||
"scopes.userAuthWrite.description": {
|
||||
"message": "Modifica tus datos de autenticación"
|
||||
"message": "Modificar tus datos de autentificación"
|
||||
},
|
||||
"scopes.userAuthWrite.label": {
|
||||
"message": "Escribir datos de autentificación"
|
||||
@@ -3447,7 +3204,7 @@
|
||||
"message": "Accede a la información de tu perfil público"
|
||||
},
|
||||
"scopes.userRead.label": {
|
||||
"message": "Ver datos de usuario"
|
||||
"message": "Consultar datos de usuario"
|
||||
},
|
||||
"scopes.userReadEmail.description": {
|
||||
"message": "Ver tu correo electrónico"
|
||||
@@ -3486,7 +3243,7 @@
|
||||
"message": "Crear versiones"
|
||||
},
|
||||
"search.filter.game-version-shader-message": {
|
||||
"message": "Los shaders para versiones antiguas suelen funcionar en versiones más nuevas con pequeños problemas."
|
||||
"message": "Los shader packs para versiones antiguas suelen funcionar en versiones más nuevas con pequeños problemas."
|
||||
},
|
||||
"search.filter.locked.server": {
|
||||
"message": "Proporcionado por el servidor"
|
||||
@@ -3765,7 +3522,7 @@
|
||||
"message": "Guardar cambios"
|
||||
},
|
||||
"settings.applications.button.upload-icon": {
|
||||
"message": "Cargar icono"
|
||||
"message": "Subir icono"
|
||||
},
|
||||
"settings.applications.client-id": {
|
||||
"message": "ID del cliente"
|
||||
@@ -3990,7 +3747,7 @@
|
||||
"message": "Error al renovar la suscripción"
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.text": {
|
||||
"message": "Si el servidor está actualmente cancelado, puede tardar entre 10 y 15 minutos en prepar el servidor."
|
||||
"message": "Si el servidor se encuentra cancelado, puede tomar de 10 a 15 minutos en preparar el servidor."
|
||||
},
|
||||
"settings.billing.pyro.resubscribe.request-submitted.title": {
|
||||
"message": "Solicitud de renovación de suscripción enviada"
|
||||
@@ -4089,7 +3846,7 @@
|
||||
"message": "Página de Resource Packs"
|
||||
},
|
||||
"settings.display.project-list-layouts.server": {
|
||||
"message": "Página de Servidores"
|
||||
"message": "Página de servidores"
|
||||
},
|
||||
"settings.display.project-list-layouts.shader": {
|
||||
"message": "Página de Shaders"
|
||||
@@ -4224,7 +3981,7 @@
|
||||
"message": "Sesión actual"
|
||||
},
|
||||
"settings.sessions.description": {
|
||||
"message": "Aquí están todos los dispositivos que actualmente están conectados a tu cuenta de Modrinth. Puedes cerrar la sesión en cada uno de ellos por separado.\n\nSi ves alguno que no reconoces, cierra la sesión en ese dispositivo y cambia la contraseña de tu cuenta de Modrinth de inmediato."
|
||||
"message": "Aquí tienes todos los dispositivos que están actualmente conectados a tu cuenta de Modrinth. Puedes cerrar sesión en cada uno de ellos de forma individual.\n\nSi ves algún dispositivo que no reconoces, cierra sesión en él y cambia la contraseña de tu cuenta de Modrinth de inmediato."
|
||||
},
|
||||
"settings.sessions.last-accessed-ago": {
|
||||
"message": "Último acceso {ago}"
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -947,6 +950,9 @@
|
||||
"dashboard.projects.links.source-code.label": {
|
||||
"message": "Código base"
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.description": {
|
||||
"message": "Una página que contiene información, documentación, y ayuda sobre el proyecto."
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.label": {
|
||||
"message": "Página de wiki"
|
||||
},
|
||||
@@ -2579,6 +2585,12 @@
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Visita el panel de proyectos"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "descarga{count, plural, one {} other {s}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "seguidor{count, plural,one {}other {es}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} ha sido archivado. {title} no recibirá ninguna futura actualización excepto que el autor decida desarchivar el proyecto."
|
||||
},
|
||||
@@ -2747,15 +2759,27 @@
|
||||
"scopes.organizationWrite.label": {
|
||||
"message": "Escribir organizaciones"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Crear tokens de API personales"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "Crear PATs"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Eliminar tus tokens de API personales"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "Eliminar PATs"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Ver tokens de API creados"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "Leer PATs"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Editar tokens de API personales"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "Escribir PATs"
|
||||
},
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MT"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ MT"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MT"
|
||||
},
|
||||
|
||||
@@ -8,126 +8,6 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Hindi mahanap na tagagamit"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Magdagdag"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Kanselahin"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "I-refresh"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "I-reset"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Bansa"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Rason ng pag-download"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "Pinanggalingan ng pag-download"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Bersiyon ng laro"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "Pag-iisa-isa"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetisasyon"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "Walang pag-iisa-isa"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Proyekto"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Estado ng proyekto"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Bersiyon ng proyekto"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "Pag-iisa-isa ng {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Ipakita ang lahat"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "Ipakta nang may-takda"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Ipakita ang unang 8"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} oras"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} aktibo"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "Mga anotasyon"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "Display"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "Ratio"
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "Kabuoan"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "Area"
|
||||
},
|
||||
"analytics.chart.view.bar": {
|
||||
"message": "Bar"
|
||||
},
|
||||
"analytics.chart.view.line": {
|
||||
"message": "Line"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Lahat"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1oras"
|
||||
},
|
||||
"analytics.group-by.6h": {
|
||||
"message": "6oras"
|
||||
},
|
||||
"analytics.group-by.date": {
|
||||
"message": "Petsa"
|
||||
},
|
||||
"analytics.group-by.day": {
|
||||
"message": "Araw"
|
||||
},
|
||||
"analytics.group-by.month": {
|
||||
"message": "Buwan"
|
||||
},
|
||||
"analytics.group-by.week": {
|
||||
"message": "Linggo"
|
||||
},
|
||||
"analytics.group-by.year": {
|
||||
"message": "Taon"
|
||||
},
|
||||
"analytics.project-status.draft": {
|
||||
"message": "Burador"
|
||||
},
|
||||
"analytics.stat.unavailable": {
|
||||
"message": "N/A"
|
||||
},
|
||||
"analytics.stat.views": {
|
||||
"message": "Pagtingin"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Wala"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Magagamit ang aming desktop app sa iba’t-ibang plataporma, piliin ang iyong gugustohing bersiyon."
|
||||
},
|
||||
@@ -242,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -524,12 +407,6 @@
|
||||
"collection.title": {
|
||||
"message": "{name} - Koleksiyon"
|
||||
},
|
||||
"conversation-thread.action.reply": {
|
||||
"message": "Tugunan"
|
||||
},
|
||||
"conversation-thread.action.send": {
|
||||
"message": "Ipadala"
|
||||
},
|
||||
"create-project-version.create-modal.stage.add-files.admonition": {
|
||||
"message": "Ang mga supplementary file ay para sa mga resource na pangsuporta katulad ng source code, hindi para sa ibang bersiyon or baryante."
|
||||
},
|
||||
@@ -1025,30 +902,6 @@
|
||||
"dashboard.projects.project.review-environment-metadata": {
|
||||
"message": "Pakisuri sa metadata sa environment"
|
||||
},
|
||||
"dashboard.projects.sort.option.name": {
|
||||
"message": "Pangalan"
|
||||
},
|
||||
"dashboard.projects.sort.option.status": {
|
||||
"message": "Estado"
|
||||
},
|
||||
"dashboard.projects.sort.option.type": {
|
||||
"message": "Uri"
|
||||
},
|
||||
"dashboard.projects.table.icon": {
|
||||
"message": "Ikono"
|
||||
},
|
||||
"dashboard.projects.table.id": {
|
||||
"message": "ID"
|
||||
},
|
||||
"dashboard.projects.table.name": {
|
||||
"message": "Pangalan"
|
||||
},
|
||||
"dashboard.projects.table.status": {
|
||||
"message": "Estado"
|
||||
},
|
||||
"dashboard.projects.table.type": {
|
||||
"message": "Uri"
|
||||
},
|
||||
"dashboard.reports.active-title": {
|
||||
"message": "Aktibong sumbong"
|
||||
},
|
||||
@@ -2609,6 +2462,12 @@
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "Bisitahin ang dashboard ng mga proyekto"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "download {count, plural, one {} other {}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {} other {na }}follower"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "Inarkibo ang {title}. Ang {title} ay hindi na tatanggap ng mga update maliban kung iwawala nila ang pagkaarkibo ng proyekto."
|
||||
},
|
||||
@@ -2777,15 +2636,27 @@
|
||||
"scopes.organizationWrite.label": {
|
||||
"message": "Pagsulat sa organisasyon"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Paglikha ng mga personal API token"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "Paglikha ng PAT"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Pagtanggal ng iyong mga personal API token"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "Pagtanggal ng PAT"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Pagtingin sa mga linikhang API token"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "Pagbasa ng PAT"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Pagbago ng mga personal API token"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "Pagsulat sa PAT"
|
||||
},
|
||||
|
||||
@@ -8,450 +8,6 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Utilisateur non trouvé"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Ajouter"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Annuler"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "Rafraîchir"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "Réinitialiser"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Pays"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Télécharger la raison"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "Télécharger la source"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Version du jeu"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "Répartition"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Loader"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monétisation"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "Aucune répartition"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Projet"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Statut du projet"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Version du projet"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "Répartition par {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Montrer tout"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "Montrer limités"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Montrer le top 8"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} h"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} actif"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "Annotations"
|
||||
},
|
||||
"analytics.chart.controls.aria": {
|
||||
"message": "Contrôles du graphique d’analytique, {activeCount}"
|
||||
},
|
||||
"analytics.chart.controls.button": {
|
||||
"message": "Contrôles"
|
||||
},
|
||||
"analytics.chart.controls.dialog-aria": {
|
||||
"message": "Contrôles du graphique d’analyse"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "Afficher"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Événements Modrinth"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Aucun événement Modrinth dans le graphique."
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "Aucun événement projet dans le graphique."
|
||||
},
|
||||
"analytics.chart.controls.previous-period": {
|
||||
"message": "Période précédente"
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "Événements projet"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "Ratio"
|
||||
},
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Sélectionnez les éléments du tableau ci-dessous pour visualiser vos données."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, one {# événement analytique} other {# événements analytiques}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Voir l’annonce"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.aria": {
|
||||
"message": "Voir les détails des statistiques de monétisation"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.description": {
|
||||
"message": "Seules les vues et les téléchargements effectués via Modrinth sont pris en compte pour la monétisation, et les téléchargements nécessitent que les utilisateurs soient connectés."
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.title": {
|
||||
"message": "Détails des statistiques de monétisation"
|
||||
},
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (Préc.)"
|
||||
},
|
||||
"analytics.chart.render-limit.description": {
|
||||
"message": "Afficher toutes les lignes sélectionnées du tableau peut dégrader les performances de la page."
|
||||
},
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Afficher les {count} lignes sur le graphique ?"
|
||||
},
|
||||
"analytics.chart.table-selection.all": {
|
||||
"message": "Montrer {itemType, select, project {{count, plural, one {1 projet} other {tous les projets}}} country {{count, plural, one {1 pays} other {tous les pays}}} monetization {{count, plural, one {1 valeur de monétisation} other {toutes les valeurs de monétisation}}} downloadSource {{count, plural, one {1 source de téléchargement} other {toutes les sources de téléchargement}}} downloadReason {{count, plural, one {1 raison de téléchargement} other {toutes les raisons de téléchargement}}} projectVersion {{count, plural, one {1 version de projet} other {toutes les versions de projets}}} loader {{count, plural, one {1 loader} other {tous les loaders}}} gameVersion {{count, plural, one {1 version du jeu} other {toutes les version versions du jeu}}} other {{count, plural, one {l'objet} other {tous les objets}}}} du tableau"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.days": {
|
||||
"message": "{count, plural, one {# jour} other {# jours}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.hours": {
|
||||
"message": "{count, plural, one {# heure} other {# heures}}"
|
||||
},
|
||||
"analytics.chart.tooltip.duration.minutes": {
|
||||
"message": "{count, plural, one {# minute} other {# minutes}}"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Masquer {name} dans le graphique"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned": {
|
||||
"message": "Infobulle du graphique épinglée"
|
||||
},
|
||||
"analytics.chart.tooltip.pinned-aria": {
|
||||
"message": "Épinglé"
|
||||
},
|
||||
"analytics.chart.tooltip.previous-period-short": {
|
||||
"message": "(préc.)"
|
||||
},
|
||||
"analytics.chart.tooltip.show-entry": {
|
||||
"message": "Montrer {name} dans le graphique"
|
||||
},
|
||||
"analytics.chart.tooltip.total": {
|
||||
"message": "Total"
|
||||
},
|
||||
"analytics.chart.view.area": {
|
||||
"message": "Aire"
|
||||
},
|
||||
"analytics.chart.view.bar": {
|
||||
"message": "Barres"
|
||||
},
|
||||
"analytics.chart.view.line": {
|
||||
"message": "Courbes"
|
||||
},
|
||||
"analytics.download-reason.dependency": {
|
||||
"message": "Dépendance"
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "Modpack"
|
||||
},
|
||||
"analytics.download-reason.standalone": {
|
||||
"message": "Autonome"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "Mettre à jour"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "Site web de Modrinth"
|
||||
},
|
||||
"analytics.downloads.suffix": {
|
||||
"message": "téléchargements"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "Aucune donnée disponible"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "Aucune donnée d’analyse disponible"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "Aucun projet disponible"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "Aucun projet disponible pour les analyses"
|
||||
},
|
||||
"analytics.empty.select-project": {
|
||||
"message": "Sélectionnez au moins un projet pour afficher les données"
|
||||
},
|
||||
"analytics.filter.game-version-type": {
|
||||
"message": "Type de version du jeu"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Tout"
|
||||
},
|
||||
"analytics.filter.game-version-type.release": {
|
||||
"message": "Sortie"
|
||||
},
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Rechercher des pays..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Rechercher des sources de téléchargement..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Rechercher des versions du projet..."
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "Rechercher des versions..."
|
||||
},
|
||||
"analytics.graph.title.downloads": {
|
||||
"message": "Téléchargements au fil du temps"
|
||||
},
|
||||
"analytics.graph.title.playtime": {
|
||||
"message": "Temps de jeu au fil du temps"
|
||||
},
|
||||
"analytics.graph.title.revenue": {
|
||||
"message": "Revenus au fil du temps"
|
||||
},
|
||||
"analytics.graph.title.views": {
|
||||
"message": "Vues au fil du temps"
|
||||
},
|
||||
"analytics.group-by.1h": {
|
||||
"message": "1h"
|
||||
},
|
||||
"analytics.group-by.6h": {
|
||||
"message": "6h"
|
||||
},
|
||||
"analytics.group-by.date": {
|
||||
"message": "Date"
|
||||
},
|
||||
"analytics.group-by.day": {
|
||||
"message": "Jour"
|
||||
},
|
||||
"analytics.group-by.month": {
|
||||
"message": "Mois"
|
||||
},
|
||||
"analytics.group-by.selected.day": {
|
||||
"message": "Grouper par jour"
|
||||
},
|
||||
"analytics.group-by.selected.hour": {
|
||||
"message": "Grouper par heure"
|
||||
},
|
||||
"analytics.group-by.selected.month": {
|
||||
"message": "Grouper par mois"
|
||||
},
|
||||
"analytics.group-by.selected.six-hours": {
|
||||
"message": "Regrouper par tranches de 6 heures"
|
||||
},
|
||||
"analytics.group-by.selected.week": {
|
||||
"message": "Regrouper par semaine"
|
||||
},
|
||||
"analytics.group-by.selected.year": {
|
||||
"message": "Regrouper par année"
|
||||
},
|
||||
"analytics.group-by.week": {
|
||||
"message": "Semaine"
|
||||
},
|
||||
"analytics.group-by.year": {
|
||||
"message": "Année"
|
||||
},
|
||||
"analytics.loading.fetching-results": {
|
||||
"message": "Récupération des résultats..."
|
||||
},
|
||||
"analytics.options.loading": {
|
||||
"message": "Chargement..."
|
||||
},
|
||||
"analytics.project-event.project-approved": {
|
||||
"message": "Projet approuvé"
|
||||
},
|
||||
"analytics.project-event.project-private": {
|
||||
"message": "Projet mis en privé"
|
||||
},
|
||||
"analytics.project-event.project-status-changed": {
|
||||
"message": "Le statut du projet a changé"
|
||||
},
|
||||
"analytics.project-event.project-unlisted": {
|
||||
"message": "Projet non répertorié"
|
||||
},
|
||||
"analytics.project-event.version-released": {
|
||||
"message": "{version} sortie"
|
||||
},
|
||||
"analytics.project-event.version-uploaded": {
|
||||
"message": "Version téléversée"
|
||||
},
|
||||
"analytics.project-status.approved": {
|
||||
"message": "Approuvé"
|
||||
},
|
||||
"analytics.project-status.archived": {
|
||||
"message": "Archivé"
|
||||
},
|
||||
"analytics.project-status.draft": {
|
||||
"message": "Brouillon"
|
||||
},
|
||||
"analytics.project-status.other": {
|
||||
"message": "Autre"
|
||||
},
|
||||
"analytics.project-status.private": {
|
||||
"message": "Privé"
|
||||
},
|
||||
"analytics.project-status.rejected": {
|
||||
"message": "Rejeté"
|
||||
},
|
||||
"analytics.project-status.unlisted": {
|
||||
"message": "Non répertorié"
|
||||
},
|
||||
"analytics.project-status.withheld": {
|
||||
"message": "Retenu"
|
||||
},
|
||||
"analytics.project.all": {
|
||||
"message": "Tous les projets"
|
||||
},
|
||||
"analytics.project.count": {
|
||||
"message": "{count, plural, one {# projet} other {# projets}}"
|
||||
},
|
||||
"analytics.project.icon-alt": {
|
||||
"message": "Icône de {name}"
|
||||
},
|
||||
"analytics.project.select": {
|
||||
"message": "Sélectionner des projets"
|
||||
},
|
||||
"analytics.query.filter.add": {
|
||||
"message": "Ajouter un filtre"
|
||||
},
|
||||
"analytics.query.label.breakdown": {
|
||||
"message": "Répartition :"
|
||||
},
|
||||
"analytics.query.label.grouped-by": {
|
||||
"message": "Regroupé par"
|
||||
},
|
||||
"analytics.query.label.project": {
|
||||
"message": "Projet :"
|
||||
},
|
||||
"analytics.query.label.timeframe": {
|
||||
"message": "Période :"
|
||||
},
|
||||
"analytics.stat.downloads": {
|
||||
"message": "Téléchargements"
|
||||
},
|
||||
"analytics.stat.playtime": {
|
||||
"message": "Temps de jeu"
|
||||
},
|
||||
"analytics.stat.playtime-hours": {
|
||||
"message": "{hours} h"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison": {
|
||||
"message": "vs période précédente"
|
||||
},
|
||||
"analytics.stat.previous-period-comparison-short": {
|
||||
"message": "vs préc."
|
||||
},
|
||||
"analytics.stat.revenue": {
|
||||
"message": "Revenue"
|
||||
},
|
||||
"analytics.stat.revenue-value": {
|
||||
"message": "${value}"
|
||||
},
|
||||
"analytics.stat.unavailable": {
|
||||
"message": "S/O"
|
||||
},
|
||||
"analytics.stat.unavailable-tooltip": {
|
||||
"message": "Statistique non disponible pour la requête actuelle"
|
||||
},
|
||||
"analytics.stat.views": {
|
||||
"message": "Vus"
|
||||
},
|
||||
"analytics.table.csv.date-range": {
|
||||
"message": "{start} à {end}"
|
||||
},
|
||||
"analytics.table.csv.filename": {
|
||||
"message": "Modrinth Analytics {breakdown} Répartition - {dateRange}"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Temps de jeu (en secondes)"
|
||||
},
|
||||
"analytics.table.csv.selected-range": {
|
||||
"message": "Plage sélectionnée"
|
||||
},
|
||||
"analytics.table.duration.days": {
|
||||
"message": "{count, plural, one {# jour} other {# jours}}"
|
||||
},
|
||||
"analytics.table.duration.hours": {
|
||||
"message": "{count, plural, one {# heure} other {# heures}}"
|
||||
},
|
||||
"analytics.table.duration.minutes": {
|
||||
"message": "{count, plural, one {# minute} other {# minutes}}"
|
||||
},
|
||||
"analytics.table.export.grouped": {
|
||||
"message": "Groupé par {groupBy}"
|
||||
},
|
||||
"analytics.table.pagination.summary": {
|
||||
"message": "Montrer {start} à {end} sur {total}"
|
||||
},
|
||||
"analytics.table.search.placeholder": {
|
||||
"message": "Recherche..."
|
||||
},
|
||||
"analytics.threshold.countries-above": {
|
||||
"message": "Pays ci-dessus"
|
||||
},
|
||||
"analytics.threshold.country-downloads-aria": {
|
||||
"message": "Seuil de téléchargements par pays"
|
||||
},
|
||||
"analytics.threshold.game-versions-above": {
|
||||
"message": "Versions du jeu ci-dessus"
|
||||
},
|
||||
"analytics.threshold.project-version-downloads-aria": {
|
||||
"message": "Seuil de téléchargements des versions du projet"
|
||||
},
|
||||
"analytics.threshold.project-versions-above": {
|
||||
"message": "Versions du projet ci-dessus"
|
||||
},
|
||||
"analytics.threshold.projects-above": {
|
||||
"message": "Projets ci-dessus"
|
||||
},
|
||||
"analytics.title": {
|
||||
"message": "Statistiques"
|
||||
},
|
||||
"analytics.value.monetized": {
|
||||
"message": "Monétisé"
|
||||
},
|
||||
"analytics.value.none": {
|
||||
"message": "Aucun"
|
||||
},
|
||||
"analytics.value.other": {
|
||||
"message": "Autre"
|
||||
},
|
||||
"analytics.value.unknown": {
|
||||
"message": "Inconnu"
|
||||
},
|
||||
"analytics.value.unmonetized": {
|
||||
"message": "Non monétisé"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Notre application de bureau est disponible sur toutes les plateformes, choisissez la version qui vous convient."
|
||||
},
|
||||
@@ -567,7 +123,7 @@
|
||||
"message": "∞ Mo"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ × ∞ Mo"
|
||||
"message": "∞ * ∞ Mo"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 Mo"
|
||||
@@ -1511,9 +1067,6 @@
|
||||
"dashboard.projects.links.discord-invite.label": {
|
||||
"message": "Invitation Discord"
|
||||
},
|
||||
"dashboard.projects.links.header.edit": {
|
||||
"message": "Modifier les liens"
|
||||
},
|
||||
"dashboard.projects.links.issue-tracker.description": {
|
||||
"message": "Un endroit pour que les utilisateurs signalent des bugs, problèmes et préoccupations à propos de votre projet."
|
||||
},
|
||||
@@ -1539,7 +1092,7 @@
|
||||
"message": "Code source"
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.description": {
|
||||
"message": "Une page contenant des informations, de la documentation et de l’aide pour le projet"
|
||||
"message": "Une page contenant des informations, de la documentation et de l'aide pour le projet."
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.label": {
|
||||
"message": "Page wiki"
|
||||
@@ -1803,20 +1356,11 @@
|
||||
"message": "Aucun monde serveur n'est disponible pour l'installation."
|
||||
},
|
||||
"discover.install.error.unsupported-content-type": {
|
||||
"message": "Ce type de contenu ne peut pas être installé sur un serveur depuis Découvrir."
|
||||
"message": "Ce type de contenu ne peut pas être installé sur un serveur depuis la navigation."
|
||||
},
|
||||
"discover.install.heading.reset-modpack": {
|
||||
"message": "Sélectionner un modpack à insaller après la réinitialisation"
|
||||
},
|
||||
"discover.seo.description": {
|
||||
"message": "Recherchez et explorez des milliers de {projectType} Minecraft sur Modrinth avec des résultats instantanés et précis. Nos filtres vous aident à trouver rapidement les meilleurs {projectType}."
|
||||
},
|
||||
"discover.seo.title": {
|
||||
"message": "Chercher des {projectType}"
|
||||
},
|
||||
"discover.seo.title-with-query": {
|
||||
"message": "Chercher des {projectType} | {query}"
|
||||
},
|
||||
"error.collection.404.list_item.1": {
|
||||
"message": "Vous avez peut-être mal tapé l'URL de la collection."
|
||||
},
|
||||
@@ -2804,9 +2348,6 @@
|
||||
"muralpay.warning.wallet-address": {
|
||||
"message": "Vérifiez votre adresse. Les fonds envoyés à une adresse incorrecte ne pourront pas être récupérés."
|
||||
},
|
||||
"organization.settings.projects.edit-links.affected-projects": {
|
||||
"message": "Les modifications seront appliquées à {count, plural, one {# projet} other {# projets}}."
|
||||
},
|
||||
"profile.bio.fallback.creator": {
|
||||
"message": "Un créateur Modrinth."
|
||||
},
|
||||
@@ -2831,9 +2372,6 @@
|
||||
"profile.button.set-affiliate": {
|
||||
"message": "Se mettre comme affilié"
|
||||
},
|
||||
"profile.collection.projects-count": {
|
||||
"message": "{count, plural,one {# projet} other {# projets}}"
|
||||
},
|
||||
"profile.details.label.auth-providers": {
|
||||
"message": "Fournisseurs d’authentification"
|
||||
},
|
||||
@@ -2903,12 +2441,6 @@
|
||||
"profile.meta.description-with-bio": {
|
||||
"message": "{bio} - Téléchargez les projets de {username} sur Modrinth"
|
||||
},
|
||||
"profile.official-account": {
|
||||
"message": "Compte Modrinth Officiel"
|
||||
},
|
||||
"profile.official-account.bio": {
|
||||
"message": "Le compte utilisateur officiel de Modrinth. Obtenez de l’aide via <support-link></support-link> ou par e-mail à <email></email>"
|
||||
},
|
||||
"profile.stats.projects-followers": {
|
||||
"message": "{count, plural, one {<stat>{count}</stat> personne adore} other {<stat>{count}</stat> personnes adorent}}"
|
||||
},
|
||||
@@ -3354,10 +2886,10 @@
|
||||
"message": "Visiter le tableau de contrôle des projets"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, one {# téléchargement} other {# téléchargements}}"
|
||||
"message": "téléchargement{count, plural, one {} other {s}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {# suivi} other {# suivis}}"
|
||||
"message": "adore{count, plural, one {} other {nt}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "{title} a été archivé. {title} ne recevra plus de mises à jour jusqu'à ce que l'auteur du projet décide de désarchiver le projet."
|
||||
@@ -3377,24 +2909,12 @@
|
||||
"report.already-reported": {
|
||||
"message": "Vous avez déjà signalé {title}"
|
||||
},
|
||||
"report.already-reported-description": {
|
||||
"message": "Vous avez déjà un signalement ouvert pour ce {item}. Vous pouvez ajouter des détails supplémentaires à votre signalement si vous avez plus d’informations à fournir."
|
||||
},
|
||||
"report.back-to-item": {
|
||||
"message": "Retour à {item}"
|
||||
},
|
||||
"report.body.description": {
|
||||
"message": "Incluez des liens et des images si possible et pertinentes. Les signalements vides ou insuffisants seront fermés et ignorés."
|
||||
},
|
||||
"report.body.title": {
|
||||
"message": "Veuillez fournir des informations supplémentaires concernant votre signalement."
|
||||
},
|
||||
"report.checking": {
|
||||
"message": "Vérification de {item}..."
|
||||
},
|
||||
"report.could-not-find": {
|
||||
"message": "Impossible de trouver {item}"
|
||||
},
|
||||
"report.for.violation": {
|
||||
"message": "Violation des <rules-link>Règles</rules-link> ou des <terms-link>Conditions d’utilisation</terms-link> de Modrinth"
|
||||
},
|
||||
@@ -3434,15 +2954,9 @@
|
||||
"report.please-report": {
|
||||
"message": "Veuillez signaler :"
|
||||
},
|
||||
"report.question.content-id": {
|
||||
"message": "Quel est l’ID de {item} ?"
|
||||
},
|
||||
"report.question.content-type": {
|
||||
"message": "Quel type de contenu signalez-vous ?"
|
||||
},
|
||||
"report.question.report-reason": {
|
||||
"message": "Quelle règle de Modrinth {item} viole-t-il ?"
|
||||
},
|
||||
"report.report-content": {
|
||||
"message": "Signaler le contenu aux modérateurs"
|
||||
},
|
||||
@@ -3555,25 +3069,25 @@
|
||||
"message": "Écrire des organisations"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Créer un token d’accès personnel"
|
||||
"message": "Créer des jetons d'API personnels"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "Créer des PATs"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Supprimer vos tokens d’accès personnels"
|
||||
"message": "Supprimer vos jetons d'API personnels"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "Supprimer des PATs"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Voir les tokens d’accès personnels créés"
|
||||
"message": "Voir les jetons d'API créés"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "Lire des PATs"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Modifier les tokens d’accès personnels"
|
||||
"message": "Modifier les jetons d'API personnels"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "Créer des PATs"
|
||||
@@ -3782,9 +3296,6 @@
|
||||
"servers.plan.small.description": {
|
||||
"message": "Parfait pour 1–5 amis et quelques mods légers."
|
||||
},
|
||||
"servers.purchase.step.plan.billed": {
|
||||
"message": "facturé {interval, select, monthly {mensuellement} quarterly {trimestriellement} yearly {annuellement} other {{interval}}}"
|
||||
},
|
||||
"settings.account.button.complete-setup": {
|
||||
"message": "Terminer la configuration"
|
||||
},
|
||||
@@ -3947,12 +3458,6 @@
|
||||
"settings.account.security.two-factor.description": {
|
||||
"message": "Ajoutez une couche de sécurité supplémentaire à votre compte lors de la connexion."
|
||||
},
|
||||
"settings.account.security.two-factor.modal.remove.header": {
|
||||
"message": "Supprimer la 2FA"
|
||||
},
|
||||
"settings.account.security.two-factor.modal.setup.header": {
|
||||
"message": "Configurer la 2FA"
|
||||
},
|
||||
"settings.account.security.two-factor.title": {
|
||||
"message": "Authentification à deux facteurs"
|
||||
},
|
||||
@@ -4286,18 +3791,9 @@
|
||||
"settings.billing.subscription.title": {
|
||||
"message": "Abonnements"
|
||||
},
|
||||
"settings.billing.switch.switching-to-interval": {
|
||||
"message": "Passage à {interval, select, monthly {mensuel} yearly {annuel} other {{interval}}}"
|
||||
},
|
||||
"settings.billing.switch.to-interval": {
|
||||
"message": "Passer à {interval, select, monthly {mensuel} yearly {annuel} other {{interval}}}"
|
||||
},
|
||||
"settings.billing.switch.tooltip.monthly-additional-per-year": {
|
||||
"message": "La facturation mensuelle vous coûtera un supplément de {amount} par an"
|
||||
},
|
||||
"settings.billing.switches-to-billing-on": {
|
||||
"message": "Passe à la facturation {interval, select, monthly {mensuelle} yearly {annuelle} other {{interval}}} le {date}"
|
||||
},
|
||||
"settings.billing.update-method": {
|
||||
"message": "Mettre à jour le moyen de paiement"
|
||||
},
|
||||
|
||||
@@ -122,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ מגה-בייט"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ מגה-בייט"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "פחות מ-150 מגה-בייט"
|
||||
},
|
||||
@@ -2222,6 +2225,12 @@
|
||||
"project.settings.visit-dashboard": {
|
||||
"message": "ללוח הבקרה של הפרויקטים"
|
||||
},
|
||||
"project.stats.downloads-label": {
|
||||
"message": "{count, plural, one {הורדה} other {הורדות}}"
|
||||
},
|
||||
"project.stats.followers-label": {
|
||||
"message": "{count, plural, one {עוקב} other {עוקבים}}"
|
||||
},
|
||||
"project.status.archived.message": {
|
||||
"message": "הפרויקט {title} הועבר לארכיון. {title} לא יקבל עדכונים נוספים, אלא אם המחבר יחליט להוציא את הפרויקט מהארכיון."
|
||||
},
|
||||
|
||||
@@ -8,168 +8,6 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Felhasználó nem található"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Hozzáadás"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Mégse"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "Újratöltés"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "Visszaállítás"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Ország"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Letöltés oka"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "Forrás letöltése"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Játék verziója"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "Részletezés"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Betöltő"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Bevételszerzés"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "Nem részletezés"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Projekt"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Projekt állapota"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Projekt verzió"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "{breakdown} szerinti részletezés"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Mindet megmutat"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "Szűkített nézet"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Top 8 megjelenítése"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} ó"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} aktív"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "Megjegyzések"
|
||||
},
|
||||
"analytics.chart.controls.aria": {
|
||||
"message": "Elemzési grafikonvezérlők, {activeCount}"
|
||||
},
|
||||
"analytics.chart.controls.button": {
|
||||
"message": "Irányítások"
|
||||
},
|
||||
"analytics.chart.controls.dialog-aria": {
|
||||
"message": "Elemzési grafikonok vezérlőelemei"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "Kijelző"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Modrinth események"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Nincs Modrinth esemény a grafiokonon."
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "A grafikonon nincs projektesemény."
|
||||
},
|
||||
"analytics.chart.controls.previous-period": {
|
||||
"message": "Előző időszak"
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "Projekt események"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "Arány"
|
||||
},
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Válasszon elemeket az alábbi táblázatból az adatok megjelenítéséhez."
|
||||
},
|
||||
"analytics.chart.events.count-aria": {
|
||||
"message": "{count, plural, one {# analitikai esemény} other {# analitikai esemény}}"
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Közlemények megtekintése"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.aria": {
|
||||
"message": "Bevételszerzési analitikai részletek megtekintése"
|
||||
},
|
||||
"analytics.chart.legend.monetization-details.description": {
|
||||
"message": "Csak a Modrinthon keresztül történő megtekintések és letöltések számítanak bele a bevételszerzésbe, és a letöltéshez a felhasználóknak be kell jelentkezniük."
|
||||
},
|
||||
"analytics.download-reason.modpack": {
|
||||
"message": "Modcsomag"
|
||||
},
|
||||
"analytics.download-reason.update": {
|
||||
"message": "Frissítés"
|
||||
},
|
||||
"analytics.download-source.app": {
|
||||
"message": "Modrinth App"
|
||||
},
|
||||
"analytics.download-source.website": {
|
||||
"message": "A Modrinth weboldala"
|
||||
},
|
||||
"analytics.empty.no-data": {
|
||||
"message": "Nincs elérhető adat"
|
||||
},
|
||||
"analytics.empty.no-data-for-analytics": {
|
||||
"message": "Nincs elérhető adat a statisztikához"
|
||||
},
|
||||
"analytics.empty.no-projects": {
|
||||
"message": "Nincs elérhető projekt"
|
||||
},
|
||||
"analytics.empty.no-projects-for-analytics": {
|
||||
"message": "Nincs elérhető projekt a statisztikához"
|
||||
},
|
||||
"analytics.filter.game-version-type.all": {
|
||||
"message": "Összes"
|
||||
},
|
||||
"analytics.filter.game-version-type.release": {
|
||||
"message": "Kiadás"
|
||||
},
|
||||
"analytics.filter.search.countries": {
|
||||
"message": "Országok keresése..."
|
||||
},
|
||||
"analytics.filter.search.download-sources": {
|
||||
"message": "Letöltési források keresése..."
|
||||
},
|
||||
"analytics.filter.search.project-versions": {
|
||||
"message": "Projektverziók keresése..."
|
||||
},
|
||||
"analytics.filter.search.versions": {
|
||||
"message": "Verziók keresése..."
|
||||
},
|
||||
"analytics.project-event.version-uploaded": {
|
||||
"message": "Verzió feltöltve"
|
||||
},
|
||||
"analytics.table.csv.header.playtime-seconds": {
|
||||
"message": "Játékidő (másodpercben)"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Asztali alkalmazásunk minden platformon elérhető, válaszd ki a kívánt verziót."
|
||||
},
|
||||
@@ -284,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -1187,6 +1028,9 @@
|
||||
"dashboard.projects.links.source-code.label": {
|
||||
"message": "Forráskód"
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.description": {
|
||||
"message": "Egy oldal, amely információkat, dokumentációt és segítséget tartalmaz a projekthez."
|
||||
},
|
||||
"dashboard.projects.links.wiki-page.label": {
|
||||
"message": "Wiki oldal"
|
||||
},
|
||||
@@ -1445,6 +1289,9 @@
|
||||
"discover.install.error.no-server-world": {
|
||||
"message": "Nem található szerver világ ami letölthető."
|
||||
},
|
||||
"discover.install.error.unsupported-content-type": {
|
||||
"message": "Ez a tartalomtípus nem telepíthető a szerverre a „” menüpontból."
|
||||
},
|
||||
"error.collection.404.list_item.1": {
|
||||
"message": "Elírhatad a gyűjtemémyed linkjét."
|
||||
},
|
||||
@@ -3053,15 +2900,27 @@
|
||||
"scopes.organizationWrite.label": {
|
||||
"message": "Szervezetekhez írás"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Személyes API tokenek létrehozása"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "PAT-ek létrehozása"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Személyes API tokenek törlése"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "PAT-ek törlése"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Létrehozott API tokenek megtekintése"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "PAT-ek olvasása"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Személyes API tokenek szerkesztése"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "PAT-ek írása"
|
||||
},
|
||||
|
||||
@@ -8,120 +8,6 @@
|
||||
"admin.billing.error.not-found": {
|
||||
"message": "Pengguna tidak ditemukan"
|
||||
},
|
||||
"analytics.action.add": {
|
||||
"message": "Tambah"
|
||||
},
|
||||
"analytics.action.cancel": {
|
||||
"message": "Batal"
|
||||
},
|
||||
"analytics.action.refresh": {
|
||||
"message": "Segarkan"
|
||||
},
|
||||
"analytics.action.reset": {
|
||||
"message": "Atur Ulang"
|
||||
},
|
||||
"analytics.breakdown.country": {
|
||||
"message": "Negara"
|
||||
},
|
||||
"analytics.breakdown.download-reason": {
|
||||
"message": "Alasan pengunduhan"
|
||||
},
|
||||
"analytics.breakdown.download-source": {
|
||||
"message": "Sumber pengdunduhan"
|
||||
},
|
||||
"analytics.breakdown.game-version": {
|
||||
"message": "Versi permainan"
|
||||
},
|
||||
"analytics.breakdown.generic": {
|
||||
"message": "Uraian"
|
||||
},
|
||||
"analytics.breakdown.loader": {
|
||||
"message": "Pemuat"
|
||||
},
|
||||
"analytics.breakdown.monetization": {
|
||||
"message": "Monetisasi"
|
||||
},
|
||||
"analytics.breakdown.none.selected": {
|
||||
"message": "Tanpa uraian"
|
||||
},
|
||||
"analytics.breakdown.project": {
|
||||
"message": "Proyek"
|
||||
},
|
||||
"analytics.breakdown.project-status": {
|
||||
"message": "Status proyek"
|
||||
},
|
||||
"analytics.breakdown.project-version": {
|
||||
"message": "Versi proyek"
|
||||
},
|
||||
"analytics.breakdown.selected": {
|
||||
"message": "Uraikan berdasarkan {breakdown}"
|
||||
},
|
||||
"analytics.chart.action.show-all": {
|
||||
"message": "Tampilkan semua"
|
||||
},
|
||||
"analytics.chart.action.show-limited": {
|
||||
"message": "Tampilkan secara terbatas"
|
||||
},
|
||||
"analytics.chart.action.show-top-eight": {
|
||||
"message": "Tampilkan 8 teratas"
|
||||
},
|
||||
"analytics.chart.axis.playtime-hours": {
|
||||
"message": "{hours} j"
|
||||
},
|
||||
"analytics.chart.controls.active-count": {
|
||||
"message": "{count} aktif"
|
||||
},
|
||||
"analytics.chart.controls.annotations": {
|
||||
"message": "Anotasi"
|
||||
},
|
||||
"analytics.chart.controls.aria": {
|
||||
"message": "Kendali grafik analisis, {activeCount}"
|
||||
},
|
||||
"analytics.chart.controls.button": {
|
||||
"message": "Kendali"
|
||||
},
|
||||
"analytics.chart.controls.dialog-aria": {
|
||||
"message": "Kendali grafik analisis"
|
||||
},
|
||||
"analytics.chart.controls.display": {
|
||||
"message": "Tampilan"
|
||||
},
|
||||
"analytics.chart.controls.modrinth-events": {
|
||||
"message": "Acara Modrinth"
|
||||
},
|
||||
"analytics.chart.controls.no-modrinth-events": {
|
||||
"message": "Tidak ada acara Modrinth di grafik."
|
||||
},
|
||||
"analytics.chart.controls.no-project-events": {
|
||||
"message": "Tidak ada acara proyek di grafik."
|
||||
},
|
||||
"analytics.chart.controls.previous-period": {
|
||||
"message": "Periode sebelumnya"
|
||||
},
|
||||
"analytics.chart.controls.project-events": {
|
||||
"message": "Acara proyek"
|
||||
},
|
||||
"analytics.chart.controls.ratio": {
|
||||
"message": "Perbandingan"
|
||||
},
|
||||
"analytics.chart.empty.select-table-items": {
|
||||
"message": "Pilih benda dari tabel di bawah ini untuk memvisualisasi data Anda."
|
||||
},
|
||||
"analytics.chart.events.project-title": {
|
||||
"message": "<project>{projectName}</project>: {title}"
|
||||
},
|
||||
"analytics.chart.events.see-announcement": {
|
||||
"message": "Lihat pengumuman"
|
||||
},
|
||||
"analytics.chart.legend.previous-period-suffix": {
|
||||
"message": "{name} (Sblm.)"
|
||||
},
|
||||
"analytics.chart.render-limit.header": {
|
||||
"message": "Tampilkan semua ({count}) garis di grafik?"
|
||||
},
|
||||
"analytics.chart.tooltip.hide-entry": {
|
||||
"message": "Sembunyikan {name} di grafik"
|
||||
},
|
||||
"app-marketing.download.description": {
|
||||
"message": "Aplikasi destop kami tersedia pada semua platform, pilih versi yang Anda inginkan."
|
||||
},
|
||||
@@ -236,6 +122,9 @@
|
||||
"app-marketing.features.performance.infinite-mb": {
|
||||
"message": "∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.infinite-times-infinite-mb": {
|
||||
"message": "∞ * ∞ MB"
|
||||
},
|
||||
"app-marketing.features.performance.less-than-150mb": {
|
||||
"message": "< 150 MB"
|
||||
},
|
||||
@@ -1013,33 +902,6 @@
|
||||
"dashboard.revenue.withdraw.header": {
|
||||
"message": "Tarik"
|
||||
},
|
||||
"dashboard.sidebar.label.activeReports": {
|
||||
"message": "Laporan aktif"
|
||||
},
|
||||
"dashboard.sidebar.label.analytics": {
|
||||
"message": "Analisis"
|
||||
},
|
||||
"dashboard.sidebar.label.creators": {
|
||||
"message": "Kreator"
|
||||
},
|
||||
"dashboard.sidebar.label.dashboard": {
|
||||
"message": "Panel tampilan"
|
||||
},
|
||||
"dashboard.sidebar.label.notifications": {
|
||||
"message": "Pemberitahuan"
|
||||
},
|
||||
"dashboard.sidebar.label.organizations": {
|
||||
"message": "Organisasi"
|
||||
},
|
||||
"dashboard.sidebar.label.overview": {
|
||||
"message": "Gambaran"
|
||||
},
|
||||
"dashboard.sidebar.label.projects": {
|
||||
"message": "Proyek"
|
||||
},
|
||||
"dashboard.sidebar.label.revenue": {
|
||||
"message": "Pendapatan"
|
||||
},
|
||||
"dashboard.withdraw.completion.account": {
|
||||
"message": "Rekening"
|
||||
},
|
||||
@@ -2678,15 +2540,27 @@
|
||||
"scopes.organizationWrite.label": {
|
||||
"message": "Tulis organisasi"
|
||||
},
|
||||
"scopes.patCreate.description": {
|
||||
"message": "Membuat token API pribadi"
|
||||
},
|
||||
"scopes.patCreate.label": {
|
||||
"message": "Buat token API pribadi"
|
||||
},
|
||||
"scopes.patDelete.description": {
|
||||
"message": "Menghapus token API pribadi Anda"
|
||||
},
|
||||
"scopes.patDelete.label": {
|
||||
"message": "Hapus token API pribadi"
|
||||
},
|
||||
"scopes.patRead.description": {
|
||||
"message": "Melihat token API yang telah dibuat"
|
||||
},
|
||||
"scopes.patRead.label": {
|
||||
"message": "Baca token API pribadi"
|
||||
},
|
||||
"scopes.patWrite.description": {
|
||||
"message": "Mengubah token API pribadi"
|
||||
},
|
||||
"scopes.patWrite.label": {
|
||||
"message": "Tulis token API pribadi"
|
||||
},
|
||||
@@ -3314,15 +3188,6 @@
|
||||
"settings.sessions.unknown-platform": {
|
||||
"message": "Platform tidak dikenal"
|
||||
},
|
||||
"settings.sidebar.label.account": {
|
||||
"message": "Akun"
|
||||
},
|
||||
"settings.sidebar.label.developer": {
|
||||
"message": "Pengembang"
|
||||
},
|
||||
"settings.sidebar.label.display": {
|
||||
"message": "Tampilan"
|
||||
},
|
||||
"ui.latest-news-row.latest-news": {
|
||||
"message": "Berita terkini dari Modrinth"
|
||||
},
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user