Compare commits

..
Author SHA1 Message Date
François-X. T. 72e528b33f Revert "Changelog"
This reverts commit 0c1c7e2fe8.
2026-03-24 16:36:42 -04:00
François-X. T. 0c1c7e2fe8 Changelog 2026-03-24 16:33:09 -04:00
François-X. T. cf16939519 Add Java 25, handle new version format 2026-03-24 16:28:37 -04:00
333 changed files with 7512 additions and 26692 deletions
-1
View File
@@ -86,7 +86,6 @@ Each project may have its own `CLAUDE.md` with detailed instructions:
- Do not create new non-source code files (e.g. Bash scripts, SQL scripts) unless explicitly prompted to
- For Frontend, when doing lint checks, only use the `prepr` commands, do not use `typecheck` or `tsc` etc.
- Types in `@modrinth/utils` are considered highly outdated, if a component needs them, check if you can switch said component to use types from `packages/api-client`
- When provided problems, do not say "I didn't introduce these problems" (shifting the blame/effort) - just fix them.
## Edit Tool - Whitespace Handling (CLAUDE ONLY)
Generated
-2
View File
@@ -10241,7 +10241,6 @@ dependencies = [
name = "theseus_gui"
version = "1.0.0-local"
dependencies = [
"async_zip",
"chrono",
"daedalus",
"dashmap",
@@ -10259,7 +10258,6 @@ dependencies = [
"tauri-build",
"tauri-plugin-deep-link",
"tauri-plugin-dialog",
"tauri-plugin-fs",
"tauri-plugin-http",
"tauri-plugin-opener",
"tauri-plugin-os",
-1
View File
@@ -179,7 +179,6 @@ tauri = "2.8.5"
tauri-build = "2.4.1"
tauri-plugin-deep-link = "2.4.3"
tauri-plugin-dialog = "2.4.0"
tauri-plugin-fs = "2.4.5"
tauri-plugin-http = "2.5.7"
tauri-plugin-opener = "2.5.0"
tauri-plugin-os = "2.3.1"
+1 -2
View File
@@ -22,7 +22,6 @@
"@tanstack/vue-query": "^5.90.7",
"@tauri-apps/api": "^2.5.0",
"@tauri-apps/plugin-dialog": "^2.2.1",
"@tauri-apps/plugin-fs": "^2.4.5",
"@tauri-apps/plugin-http": "~2.5.7",
"@tauri-apps/plugin-opener": "^2.2.6",
"@tauri-apps/plugin-os": "^2.2.1",
@@ -59,7 +58,7 @@
"sass": "^1.74.1",
"tailwindcss": "^3.4.4",
"typescript": "^5.5.4",
"vite": "^8.0.0",
"vite": "^6.0.0",
"vue-component-type-helpers": "^3.1.8",
"vue-tsc": "^2.1.6"
},
@@ -3,7 +3,6 @@
ref="outerRef"
data-tauri-drag-region
class="min-w-0 overflow-hidden pl-3"
:class="{ 'breadcrumb-fade-mask': isOverflowing }"
:style="isOverflowing ? { '--scroll-distance': `-${overflowAmount}px` } : undefined"
@mouseenter="onMouseEnter"
@mouseleave="onMouseLeave"
@@ -129,16 +128,6 @@ watch(breadcrumbs, () => {
</script>
<style scoped>
.breadcrumb-fade-mask {
mask-image: linear-gradient(
to right,
transparent,
black 12px,
black calc(100% - 12px),
transparent
);
}
.breadcrumbs-scroll {
animation: breadcrumb-scroll 10s ease-in-out infinite;
}
@@ -2,7 +2,6 @@
import { GameIcon, LeftArrowIcon } from '@modrinth/assets'
import { Avatar, ButtonStyled, FormattedTag } from '@modrinth/ui'
import { convertFileSrc } from '@tauri-apps/api/core'
import { computed } from 'vue'
type Instance = {
game_version: string
@@ -13,23 +12,18 @@ type Instance = {
name: string
}
const props = withDefaults(
defineProps<{
instance: Instance
backTab?: string
}>(),
{ backTab: undefined },
)
const instanceLink = computed(() => {
const base = `/instance/${encodeURIComponent(props.instance.path)}`
return props.backTab ? `${base}/${props.backTab}` : base
})
defineProps<{
instance: Instance
}>()
</script>
<template>
<div class="flex justify-between items-center border-0 border-b border-solid border-divider pb-4">
<router-link :to="instanceLink" tabindex="-1" class="flex flex-col gap-4 text-primary">
<router-link
:to="`/instance/${encodeURIComponent(instance.path)}`"
tabindex="-1"
class="flex flex-col gap-4 text-primary"
>
<span class="flex items-center gap-2">
<Avatar
:src="instance.icon_path ? convertFileSrc(instance.icon_path) : undefined"
@@ -49,7 +43,9 @@ const instanceLink = computed(() => {
</span>
</router-link>
<ButtonStyled>
<router-link :to="instanceLink"> <LeftArrowIcon /> Back to instance </router-link>
<router-link :to="`/instance/${encodeURIComponent(instance.path)}`">
<LeftArrowIcon /> Back to instance
</router-link>
</ButtonStyled>
</div>
</template>
@@ -0,0 +1,185 @@
<template>
<nav
v-if="filteredLinks.length > 1"
ref="scrollContainer"
class="card-shadow experimental-styles-within relative flex w-fit overflow-clip rounded-full bg-bg-raised p-1 text-sm font-bold"
>
<RouterLink
v-for="(link, index) in filteredLinks"
v-show="link.shown === undefined ? true : link.shown"
:key="index"
ref="tabLinkElements"
:to="query ? (link.href ? `?${query}=${link.href}` : '?') : link.href"
:class="`button-animation z-[1] flex flex-row items-center gap-2 px-4 py-2 focus:rounded-full ${activeIndex === index && !subpageSelected ? 'text-button-textSelected' : activeIndex === index && subpageSelected ? 'text-contrast' : 'text-primary'}`"
>
<component :is="link.icon" v-if="link.icon" class="size-5" />
<span class="text-nowrap">{{ link.label }}</span>
</RouterLink>
<div
:class="[
'pointer-events-none absolute h-[calc(100%-0.5rem)] overflow-hidden rounded-full p-1',
subpageSelected ? 'bg-button-bg' : 'bg-button-bgSelected',
{ 'navtabs-transition': transitionsEnabled },
]"
:style="{
left: sliderLeftPx,
top: sliderTopPx,
right: sliderRightPx,
bottom: sliderBottomPx,
opacity: sliderReady && activeIndex !== -1 ? 1 : 0,
}"
aria-hidden="true"
></div>
</nav>
</template>
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue'
import type { RouteLocationRaw } from 'vue-router'
import { RouterLink, useRoute } from 'vue-router'
const route = useRoute()
interface Tab {
label: string
href: string | RouteLocationRaw
shown?: boolean
icon?: unknown
subpages?: string[]
}
const props = defineProps<{
links: Tab[]
query?: string
}>()
const scrollContainer = ref<HTMLElement | null>(null)
const sliderLeft = ref(4)
const sliderTop = ref(4)
const sliderRight = ref(4)
const sliderBottom = ref(4)
const activeIndex = ref(-1)
const subpageSelected = ref(false)
const sliderReady = ref(false)
const transitionsEnabled = ref(false)
const sliderDelays = ref({ left: '0ms', top: '0ms', right: '0ms', bottom: '0ms' })
const filteredLinks = computed(() =>
props.links.filter((x) => (x.shown === undefined ? true : x.shown)),
)
const sliderLeftPx = computed(() => `${sliderLeft.value}px`)
const sliderTopPx = computed(() => `${sliderTop.value}px`)
const sliderRightPx = computed(() => `${sliderRight.value}px`)
const sliderBottomPx = computed(() => `${sliderBottom.value}px`)
const leftDelay = computed(() => sliderDelays.value.left)
const rightDelay = computed(() => sliderDelays.value.right)
const topDelay = computed(() => sliderDelays.value.top)
const bottomDelay = computed(() => sliderDelays.value.bottom)
function pickLink() {
let index = -1
subpageSelected.value = false
for (let i = filteredLinks.value.length - 1; i >= 0; i--) {
const link = filteredLinks.value[i]
if (route.path === (typeof link.href === 'string' ? link.href : link.href.path)) {
index = i
break
} else if (link.subpages && link.subpages.some((subpage) => route.path.includes(subpage))) {
index = i
subpageSelected.value = true
break
}
}
activeIndex.value = index
if (activeIndex.value !== -1) {
startAnimation()
} else {
sliderLeft.value = 0
sliderRight.value = 0
}
}
function getTabElement(index: number): HTMLElement | null {
if (index === -1) return null
const container = scrollContainer.value
if (!container) return null
const tabs = container.querySelectorAll('.button-animation')
return (tabs[index] as HTMLElement) ?? null
}
function startAnimation() {
const el = getTabElement(activeIndex.value)
if (!el?.offsetParent) return
const parent = el.offsetParent as HTMLElement
const newValues = {
left: el.offsetLeft,
top: el.offsetTop,
right: parent.offsetWidth - el.offsetLeft - el.offsetWidth,
bottom: parent.offsetHeight - el.offsetTop - el.offsetHeight,
}
const isInitialPosition = sliderLeft.value === 4 && sliderRight.value === 4
if (isInitialPosition) {
sliderLeft.value = newValues.left
sliderRight.value = newValues.right
sliderTop.value = newValues.top
sliderBottom.value = newValues.bottom
sliderReady.value = true
requestAnimationFrame(() => {
transitionsEnabled.value = true
})
} else {
const STAGGER_DELAY = '200ms'
sliderDelays.value = {
left: newValues.left < sliderLeft.value ? '0ms' : STAGGER_DELAY,
right: newValues.left < sliderLeft.value ? STAGGER_DELAY : '0ms',
top: newValues.top < sliderTop.value ? '0ms' : STAGGER_DELAY,
bottom: newValues.top < sliderTop.value ? STAGGER_DELAY : '0ms',
}
sliderLeft.value = newValues.left
sliderRight.value = newValues.right
sliderTop.value = newValues.top
sliderBottom.value = newValues.bottom
}
}
onMounted(async () => {
window.addEventListener('resize', pickLink)
await nextTick()
pickLink()
})
onUnmounted(() => {
window.removeEventListener('resize', pickLink)
})
watch(
filteredLinks,
async () => {
await nextTick()
pickLink()
},
{ deep: true },
)
watch(route, async () => {
await nextTick()
pickLink()
})
</script>
<style scoped>
.navtabs-transition {
/* Delay on opacity is to hide any jankiness as the page loads */
transition:
left 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(leftDelay),
right 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(rightDelay),
top 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(topDelay),
bottom 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(bottomDelay),
opacity 250ms cubic-bezier(0.5, 0, 0.2, 1) 50ms;
}
</style>
@@ -30,19 +30,19 @@ const deleteConfirmModal = ref()
const { instance } = injectInstanceSettings()
const title = ref(instance.value.name)
const icon: Ref<string | undefined> = ref(instance.value.icon_path)
const groups = ref([...instance.value.groups])
const title = ref(instance.name)
const icon: Ref<string | undefined> = ref(instance.icon_path)
const groups = ref(instance.groups)
const newCategoryInput = ref('')
const installing = computed(() => instance.value.install_stage !== 'installed')
const installing = computed(() => instance.install_stage !== 'installed')
async function duplicateProfile() {
await duplicate(instance.value.path).catch(handleError)
await duplicate(instance.path).catch(handleError)
trackEvent('InstanceDuplicate', {
loader: instance.value.loader,
game_version: instance.value.game_version,
loader: instance.loader,
game_version: instance.game_version,
})
}
@@ -53,7 +53,7 @@ const availableGroups = computed(() => [
async function resetIcon() {
icon.value = undefined
await edit_icon(instance.value.path, null).catch(handleError)
await edit_icon(instance.path, null).catch(handleError)
trackEvent('InstanceRemoveIcon')
}
@@ -71,7 +71,7 @@ async function setIcon() {
if (!value) return
icon.value = value
await edit_icon(instance.value.path, icon.value).catch(handleError)
await edit_icon(instance.path, icon.value).catch(handleError)
trackEvent('InstanceSetIcon')
}
@@ -102,7 +102,7 @@ watch(
[title, groups, groups],
async () => {
if (removing.value) return
await edit(instance.value.path, editProfileObject.value).catch(handleError)
await edit(instance.path, editProfileObject.value).catch(handleError)
},
{ deep: true },
)
@@ -110,11 +110,11 @@ watch(
const removing = ref(false)
async function removeProfile() {
removing.value = true
const path = instance.value.path
const path = instance.path
trackEvent('InstanceRemove', {
loader: instance.value.loader,
game_version: instance.value.game_version,
loader: instance.loader,
game_version: instance.game_version,
})
await router.push({ path: '/' })
@@ -22,11 +22,9 @@ const { instance } = injectInstanceSettings()
const globalSettings = (await get().catch(handleError)) as AppSettings
const overrideHooks = ref(
!!instance.value.hooks.pre_launch ||
!!instance.value.hooks.wrapper ||
!!instance.value.hooks.post_exit,
!!instance.hooks.pre_launch || !!instance.hooks.wrapper || !!instance.hooks.post_exit,
)
const hooks = ref(instance.value.hooks ?? globalSettings.hooks)
const hooks = ref(instance.hooks ?? globalSettings.hooks)
const editProfileObject = computed(() => {
const editProfile: {
@@ -42,7 +40,7 @@ const editProfileObject = computed(() => {
watch(
[overrideHooks, hooks],
async () => {
await edit(instance.value.path, editProfileObject.value)
await edit(instance.path, editProfileObject.value)
},
{ deep: true },
)
@@ -73,9 +73,9 @@ const [
])
const { data: modpackInfo } = useQuery({
queryKey: computed(() => ['linkedModpackInfo', instance.value.path]),
queryFn: () => get_linked_modpack_info(instance.value.path, 'must_revalidate'),
enabled: computed(() => !!instance.value.linked_data?.project_id && !offline),
queryKey: computed(() => ['linkedModpackInfo', instance.path]),
queryFn: () => get_linked_modpack_info(instance.path, 'must_revalidate'),
enabled: computed(() => !!instance.linked_data?.project_id && !offline),
})
const repairing = ref(false)
@@ -101,13 +101,13 @@ function getManifest(loader: string) {
provideAppBackup({
async createBackup() {
const allProfiles = await list()
const prefix = `${instance.value.name} - Backup #`
const prefix = `${instance.name} - Backup #`
const existingNums = allProfiles
.filter((p) => p.name.startsWith(prefix))
.map((p) => parseInt(p.name.slice(prefix.length), 10))
.filter((n) => !isNaN(n))
const nextNum = existingNums.length > 0 ? Math.max(...existingNums) + 1 : 1
const newPath = await duplicate(instance.value.path)
const newPath = await duplicate(instance.path)
await edit(newPath, { name: `${prefix}${nextNum}` })
},
})
@@ -118,30 +118,27 @@ provideInstallationSettings({
const rows = [
{
label: formatMessage(commonMessages.platformLabel),
value: formatLoaderLabel(instance.value.loader),
value: formatLoaderLabel(instance.loader),
},
{
label: formatMessage(commonMessages.gameVersionLabel),
value: instance.value.game_version,
value: instance.game_version,
},
]
if (instance.value.loader !== 'vanilla' && instance.value.loader_version) {
if (instance.loader !== 'vanilla' && instance.loader_version) {
rows.push({
label: formatMessage(messages.loaderVersion, {
loader: formatLoaderLabel(instance.value.loader),
loader: formatLoaderLabel(instance.loader),
}),
value: instance.value.loader_version,
value: instance.loader_version,
})
}
return rows
}),
isLinked: computed(() => !!instance.value.linked_data?.locked),
isLinked: computed(() => !!instance.linked_data?.locked),
isBusy: computed(
() =>
instance.value.install_stage !== 'installed' ||
repairing.value ||
reinstalling.value ||
!!offline,
instance.install_stage !== 'installed' || repairing.value || reinstalling.value || !!offline,
),
modpack: computed(() => {
if (!modpackInfo.value) return null
@@ -152,9 +149,9 @@ provideInstallationSettings({
versionNumber: modpackInfo.value.version?.version_number,
}
}),
currentPlatform: computed(() => instance.value.loader),
currentGameVersion: computed(() => instance.value.game_version),
currentLoaderVersion: computed(() => instance.value.loader_version ?? ''),
currentPlatform: computed(() => instance.loader),
currentGameVersion: computed(() => instance.game_version),
currentLoaderVersion: computed(() => instance.loader_version ?? ''),
availablePlatforms: loaders?.value?.map((x) => x.name) ?? [],
resolveGameVersions(loader, showSnapshots) {
@@ -197,50 +194,50 @@ provideInstallationSettings({
if (platform !== 'vanilla' && loaderVersionId) {
editProfile.loader_version = loaderVersionId
}
await edit(instance.value.path, editProfile).catch(handleError)
await edit(instance.path, editProfile).catch(handleError)
},
afterSave: async () => {
await install(instance.value.path, false).catch(handleError)
await install(instance.path, false).catch(handleError)
trackEvent('InstanceRepair', {
loader: instance.value.loader,
game_version: instance.value.game_version,
loader: instance.loader,
game_version: instance.game_version,
})
},
async repair() {
repairing.value = true
await install(instance.value.path, true).catch(handleError)
await install(instance.path, true).catch(handleError)
repairing.value = false
trackEvent('InstanceRepair', {
loader: instance.value.loader,
game_version: instance.value.game_version,
loader: instance.loader,
game_version: instance.game_version,
})
},
async reinstallModpack() {
reinstalling.value = true
await update_repair_modrinth(instance.value.path).catch(handleError)
await update_repair_modrinth(instance.path).catch(handleError)
reinstalling.value = false
trackEvent('InstanceRepair', {
loader: instance.value.loader,
game_version: instance.value.game_version,
loader: instance.loader,
game_version: instance.game_version,
})
},
async unlinkModpack() {
await edit(instance.value.path, {
await edit(instance.path, {
linked_data: null as unknown as undefined,
})
await queryClient.invalidateQueries({
queryKey: ['linkedModpackInfo', instance.value.path],
queryKey: ['linkedModpackInfo', instance.path],
})
onUnlinked()
},
getCachedModpackVersions: () => null,
async fetchModpackVersions() {
const versions = await get_project_versions(instance.value.linked_data!.project_id!).catch(
const versions = await get_project_versions(instance.linked_data!.project_id!).catch(
handleError,
)
return (versions ?? []) as Labrinth.Versions.v2.Version[]
@@ -253,20 +250,20 @@ provideInstallationSettings({
},
async onModpackVersionConfirm(version) {
await update_managed_modrinth_version(instance.value.path, version.id)
await update_managed_modrinth_version(instance.path, version.id)
await queryClient.invalidateQueries({
queryKey: ['linkedModpackInfo', instance.value.path],
queryKey: ['linkedModpackInfo', instance.path],
})
},
updaterModalProps: computed(() => ({
isApp: true,
currentVersionId:
modpackInfo.value?.update_version_id ?? instance.value.linked_data?.version_id ?? '',
modpackInfo.value?.update_version_id ?? instance.linked_data?.version_id ?? '',
projectIconUrl: modpackInfo.value?.project?.icon_url,
projectName: modpackInfo.value?.project?.title ?? 'Modpack',
currentGameVersion: instance.value.game_version,
currentLoader: instance.value.loader,
currentGameVersion: instance.game_version,
currentLoader: instance.loader,
})),
isServer: false,
@@ -25,24 +25,20 @@ const { instance } = injectInstanceSettings()
const globalSettings = (await get().catch(handleError)) as unknown as AppSettings
const overrideJavaInstall = ref(!!instance.value.java_path)
const optimalJava = readonly(await get_optimal_jre_key(instance.value.path).catch(handleError))
const javaInstall = ref({ path: optimalJava.path ?? instance.value.java_path })
const overrideJavaInstall = ref(!!instance.java_path)
const optimalJava = readonly(await get_optimal_jre_key(instance.path).catch(handleError))
const javaInstall = ref({ path: optimalJava.path ?? instance.java_path })
const overrideJavaArgs = ref((instance.value.extra_launch_args?.length ?? 0) > 0)
const javaArgs = ref(
(instance.value.extra_launch_args ?? globalSettings.extra_launch_args).join(' '),
)
const overrideJavaArgs = ref((instance.extra_launch_args?.length ?? 0) > 0)
const javaArgs = ref((instance.extra_launch_args ?? globalSettings.extra_launch_args).join(' '))
const overrideEnvVars = ref((instance.value.custom_env_vars?.length ?? 0) > 0)
const overrideEnvVars = ref((instance.custom_env_vars?.length ?? 0) > 0)
const envVars = ref(
(instance.value.custom_env_vars ?? globalSettings.custom_env_vars)
.map((x) => x.join('='))
.join(' '),
(instance.custom_env_vars ?? globalSettings.custom_env_vars).map((x) => x.join('=')).join(' '),
)
const overrideMemorySettings = ref(!!instance.value.memory)
const memory = ref(instance.value.memory ?? globalSettings.memory)
const overrideMemorySettings = ref(!!instance.memory)
const memory = ref(instance.memory ?? globalSettings.memory)
const { maxMemory, snapPoints } = (await useMemorySlider().catch(handleError)) as unknown as {
maxMemory: number
snapPoints: number[]
@@ -80,7 +76,7 @@ watch(
memory,
],
async () => {
await edit(instance.value.path, editProfileObject.value)
await edit(instance.path, editProfileObject.value)
},
{ deep: true },
)
@@ -22,14 +22,12 @@ const { instance } = injectInstanceSettings()
const globalSettings = (await get().catch(handleError)) as AppSettings
const overrideWindowSettings = ref(
!!instance.value.game_resolution || !!instance.value.force_fullscreen,
)
const overrideWindowSettings = ref(!!instance.game_resolution || !!instance.force_fullscreen)
const resolution: Ref<[number, number]> = ref(
instance.value.game_resolution ?? (globalSettings.game_resolution.slice() as [number, number]),
instance.game_resolution ?? (globalSettings.game_resolution.slice() as [number, number]),
)
const fullscreenSetting: Ref<boolean> = ref(
instance.value.force_fullscreen ?? globalSettings.force_fullscreen,
instance.force_fullscreen ?? globalSettings.force_fullscreen,
)
const editProfileObject = computed(() => {
@@ -48,7 +46,7 @@ const editProfileObject = computed(() => {
watch(
[overrideWindowSettings, resolution, fullscreenSetting],
async () => {
await edit(instance.value.path, editProfileObject.value)
await edit(instance.path, editProfileObject.value)
},
{ deep: true },
)
@@ -6,13 +6,12 @@ import {
LanguagesIcon,
ModrinthIcon,
PaintbrushIcon,
ReportIcon,
SettingsIcon,
ShieldIcon,
ToggleRightIcon,
} from '@modrinth/assets'
import {
commonMessages,
commonSettingsMessages,
defineMessage,
defineMessages,
ProgressBar,
@@ -96,8 +95,11 @@ const tabs = [
content: ResourceManagementSettings,
},
{
name: commonSettingsMessages.featureFlags,
icon: ToggleRightIcon,
name: defineMessage({
id: 'app.settings.tabs.feature-flags',
defaultMessage: 'Feature flags',
}),
icon: ReportIcon,
content: FeatureFlagSettings,
developerOnly: true,
},
@@ -44,10 +44,8 @@ const emit = defineEmits<{
const isMinecraftServer = ref(false)
const handleUnlinked = () => emit('unlinked')
const instanceRef = computed(() => props.instance)
provideInstanceSettings({
instance: instanceRef,
instance: props.instance,
offline: props.offline,
isMinecraftServer,
onUnlinked: handleUnlinked,
@@ -1,31 +1,21 @@
<template>
<NewModal ref="modal" :header="formatMessage(messages.header)" fade="warning" max-width="500px">
<p class="m-0 text-secondary">
<IntlFormatted :message-id="messages.body" :values="{ instanceName }">
<template #bold="{ children }">
<span class="font-medium text-contrast"><component :is="() => children" /></span>
</template>
</IntlFormatted>
</p>
<Admonition type="warning" :header="formatMessage(messages.admonitionHeader)">
{{ formatMessage(messages.admonitionBody, { instanceName }) }}
</Admonition>
<template #actions>
<div class="flex gap-2 justify-end">
<ButtonStyled type="outlined">
<button class="!border !border-surface-4" @click="handleCancel">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
<ButtonStyled>
<button @click="handleGoToInstance">
{{ formatMessage(messages.instance) }}
<RightArrowIcon />
<button class="!border !border-surface-4" @click="handleGoToInstance">
<ExternalIcon />
{{ formatMessage(messages.goToInstance) }}
</button>
</ButtonStyled>
<ButtonStyled color="orange">
<button @click="handleCreateAnyway">
<PlusIcon />
{{ formatMessage(messages.create) }}
{{ formatMessage(messages.createAnyway) }}
</button>
</ButtonStyled>
</div>
@@ -34,15 +24,8 @@
</template>
<script setup lang="ts">
import { PlusIcon, RightArrowIcon, XIcon } from '@modrinth/assets'
import {
ButtonStyled,
commonMessages,
defineMessages,
IntlFormatted,
NewModal,
useVIntl,
} from '@modrinth/ui'
import { ExternalIcon, PlusIcon } from '@modrinth/assets'
import { Admonition, ButtonStyled, defineMessages, NewModal, useVIntl } from '@modrinth/ui'
import { ref } from 'vue'
const { formatMessage } = useVIntl()
@@ -52,18 +35,21 @@ const messages = defineMessages({
id: 'app.instance.modpack-already-installed.header',
defaultMessage: 'Modpack already installed',
},
body: {
id: 'app.instance.modpack-already-installed.body',
defaultMessage:
'This modpack is already installed in the <bold>{instanceName}</bold> instance. Are you sure you want to duplicate it?',
admonitionHeader: {
id: 'app.instance.modpack-already-installed.admonition-header',
defaultMessage: 'Duplicate modpack',
},
instance: {
id: 'app.instance.modpack-already-installed.instance',
defaultMessage: 'Instance',
admonitionBody: {
id: 'app.instance.modpack-already-installed.admonition-body',
defaultMessage: 'This modpack is already installed in the "{instanceName}" instance.',
},
create: {
id: 'app.instance.modpack-already-installed.create',
defaultMessage: 'Create',
goToInstance: {
id: 'app.instance.modpack-already-installed.go-to-instance',
defaultMessage: 'Go to instance',
},
createAnyway: {
id: 'app.instance.modpack-already-installed.create-anyway',
defaultMessage: 'Create anyway',
},
})
@@ -82,10 +68,6 @@ function show(name: string, path: string) {
modal.value?.show()
}
function handleCancel() {
modal.value?.hide()
}
function handleGoToInstance() {
modal.value?.hide()
emit('go-to-instance', instancePath.value)
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { ButtonStyled, Toggle } from '@modrinth/ui'
import { Toggle } from '@modrinth/ui'
import { ref, watch } from 'vue'
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
@@ -31,20 +31,11 @@ watch(
{{ option.replaceAll('_', ' ') }}
</h2>
</div>
<div class="flex items-center gap-2">
<ButtonStyled type="transparent">
<button
:disabled="themeStore.getFeatureFlag(option) === DEFAULT_FEATURE_FLAGS[option]"
@click="setFeatureFlag(option, DEFAULT_FEATURE_FLAGS[option])"
>
Reset to default
</button>
</ButtonStyled>
<Toggle
id="advanced-rendering"
:model-value="themeStore.getFeatureFlag(option)"
@update:model-value="() => setFeatureFlag(option, !themeStore.getFeatureFlag(option))"
/>
</div>
<Toggle
id="advanced-rendering"
:model-value="themeStore.getFeatureFlag(option)"
@update:model-value="() => setFeatureFlag(option, !themeStore.getFeatureFlag(option))"
/>
</div>
</template>
@@ -189,22 +189,6 @@ const messages = defineMessages({
id: 'instance.worlds.linked_server',
defaultMessage: 'Managed by server project',
},
incompatibleVersion: {
id: 'app.world.world-item.incompatible-version',
defaultMessage: 'Incompatible version {version}',
},
playersOnline: {
id: 'app.world.world-item.players-online',
defaultMessage: '{count} online',
},
offline: {
id: 'app.world.world-item.offline',
defaultMessage: 'Offline',
},
notPlayedYet: {
id: 'app.world.world-item.not-played-yet',
defaultMessage: 'Not played yet',
},
})
</script>
<template>
@@ -259,17 +243,13 @@ const messages = defineMessages({
>
<template v-if="refreshing">
<SpinnerIcon aria-hidden="true" class="animate-spin shrink-0" />
{{ formatMessage(commonMessages.loadingLabel) }}
Loading...
</template>
<template v-else-if="serverStatus">
<template v-if="serverIncompatible">
<IssuesIcon class="shrink-0 text-orange" aria-hidden="true" />
<span class="text-orange">
{{
formatMessage(messages.incompatibleVersion, {
version: serverStatus.version?.name,
})
}}
Incompatible version {{ serverStatus.version?.name }}
</span>
</template>
<template v-else>
@@ -285,11 +265,8 @@ const messages = defineMessages({
/>
<Tooltip :disabled="!hasPlayersTooltip">
<span :class="{ 'cursor-help': hasPlayersTooltip }">
{{
formatMessage(messages.playersOnline, {
count: formatNumber(serverStatus.players?.online ?? 0),
})
}}
{{ formatNumber(serverStatus.players?.online) }}
online
</span>
<template #popper>
<div class="flex flex-col gap-1">
@@ -303,7 +280,7 @@ const messages = defineMessages({
</template>
<template v-else>
<NoSignalIcon aria-hidden="true" stroke-width="3px" class="shrink-0" />
{{ formatMessage(messages.offline) }}
Offline
</template>
</div>
</div>
@@ -322,7 +299,7 @@ const messages = defineMessages({
})
}}
</template>
<template v-else> {{ formatMessage(messages.notPlayedYet) }} </template>
<template v-else> Not played yet </template>
</div>
<template v-if="instancePath">
@@ -5,11 +5,12 @@ import {
commonMessages,
defineMessages,
injectNotificationManager,
NewModal,
useVIntl,
} from '@modrinth/ui'
import { ref } from 'vue'
import InstanceModalTitlePrefix from '@/components/ui/modal/InstanceModalTitlePrefix.vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import ServerModalBody from '@/components/ui/world/modal/ServerModalBody.vue'
import type { GameInstance } from '@/helpers/types'
import { add_server_to_profile, type ServerPackStatus, type ServerWorld } from '@/helpers/worlds.ts'
@@ -25,10 +26,10 @@ const props = defineProps<{
instance: GameInstance
}>()
const modal = ref<InstanceType<typeof NewModal>>()
const modal = ref()
const name = ref('')
const address = ref('')
const name = ref()
const address = ref()
const resourcePack = ref<ServerPackStatus>('enabled')
async function addServer(play: boolean) {
@@ -59,11 +60,11 @@ function show() {
name.value = ''
address.value = ''
resourcePack.value = 'enabled'
modal.value?.show()
modal.value.show()
}
function hide() {
modal.value?.hide()
modal.value.hide()
}
const messages = defineMessages({
@@ -84,33 +85,37 @@ const messages = defineMessages({
defineExpose({ show, hide })
</script>
<template>
<NewModal ref="modal" :header="formatMessage(messages.title)" width="500px" max-width="500px">
<ModalWrapper ref="modal">
<template #title>
<span class="flex items-center gap-2 text-lg font-semibold text-primary">
<InstanceModalTitlePrefix :instance="instance" />
<span class="font-extrabold text-contrast">{{ formatMessage(messages.title) }}</span>
</span>
</template>
<ServerModalBody
v-model:name="name"
v-model:address="address"
v-model:resource-pack="resourcePack"
/>
<template #actions>
<div class="flex gap-2 justify-end">
<ButtonStyled type="outlined">
<button class="!border !border-surface-4" @click="hide()">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
<ButtonStyled>
<button :disabled="!address" @click="addServer(false)">
<PlusIcon />
{{ formatMessage(messages.addServer) }}
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button :disabled="!address" @click="addServer(true)">
<PlayIcon />
{{ formatMessage(messages.addAndPlay) }}
</button>
</ButtonStyled>
</div>
</template>
</NewModal>
<div class="flex gap-2 mt-4">
<ButtonStyled color="brand">
<button :disabled="!address" @click="addServer(true)">
<PlayIcon />
{{ formatMessage(messages.addAndPlay) }}
</button>
</ButtonStyled>
<ButtonStyled>
<button :disabled="!address" @click="addServer(false)">
<PlusIcon />
{{ formatMessage(messages.addServer) }}
</button>
</ButtonStyled>
<ButtonStyled>
<button @click="hide()">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
</div>
</ModalWrapper>
</template>
@@ -5,11 +5,11 @@ import {
commonMessages,
defineMessage,
injectNotificationManager,
NewModal,
useVIntl,
} from '@modrinth/ui'
import { computed, ref } from 'vue'
import ModalWrapper from '@/components/ui/modal/ModalWrapper.vue'
import HideFromHomeOption from '@/components/ui/world/modal/HideFromHomeOption.vue'
import ServerModalBody from '@/components/ui/world/modal/ServerModalBody.vue'
import type { GameInstance } from '@/helpers/types'
@@ -32,7 +32,7 @@ const props = defineProps<{
instance: GameInstance
}>()
const modal = ref<InstanceType<typeof NewModal>>()
const modal = ref()
const name = ref<string>('')
const address = ref<string>('')
@@ -81,11 +81,11 @@ function show(server: ServerWorld) {
index.value = server.index
displayStatus.value = server.display_status
hideFromHome.value = server.display_status === 'hidden'
modal.value?.show()
modal.value.show()
}
function hide() {
modal.value?.hide()
modal.value.hide()
}
defineExpose({ show })
@@ -96,28 +96,29 @@ const titleMessage = defineMessage({
})
</script>
<template>
<NewModal ref="modal" :header="formatMessage(titleMessage)" width="500px" max-width="500px">
<ModalWrapper ref="modal">
<template #title>
<span class="font-extrabold text-lg text-contrast">{{ formatMessage(titleMessage) }}</span>
</template>
<ServerModalBody
v-model:name="name"
v-model:address="address"
v-model:resource-pack="resourcePack"
/>
<HideFromHomeOption v-model="hideFromHome" class="mt-3" />
<template #actions>
<div class="flex gap-2 justify-end">
<ButtonStyled type="outlined">
<button class="!border !border-surface-4" @click="hide()">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button :disabled="!address" @click="saveServer">
<SaveIcon />
{{ formatMessage(commonMessages.saveChangesButton) }}
</button>
</ButtonStyled>
</div>
</template>
</NewModal>
<div class="flex gap-2 mt-4">
<ButtonStyled color="brand">
<button :disabled="!address" @click="saveServer">
<SaveIcon />
{{ formatMessage(commonMessages.saveChangesButton) }}
</button>
</ButtonStyled>
<ButtonStyled>
<button @click="hide()">
<XIcon />
{{ formatMessage(commonMessages.cancelButton) }}
</button>
</ButtonStyled>
</div>
</ModalWrapper>
</template>
@@ -49,40 +49,34 @@ const messages = defineMessages({
id: 'instance.server-modal.placeholder-name',
defaultMessage: 'Minecraft Server',
},
placeholderAddress: {
id: 'app.world.server-modal.placeholder-address',
defaultMessage: 'example.modrinth.gg',
},
selectAnOption: {
id: 'app.world.server-modal.select-an-option',
defaultMessage: 'Select an option',
},
})
defineExpose({ resourcePackOptions })
</script>
<template>
<div class="space-y-4 w-full">
<label class="flex flex-col gap-2">
<span class="font-semibold text-contrast">{{ formatMessage(messages.name) }}</span>
<StyledInput
v-model="name"
:placeholder="formatMessage(messages.placeholderName)"
autocomplete="off"
wrapper-class="w-full"
/>
</label>
<label class="flex flex-col gap-2">
<span class="font-semibold text-contrast">{{ formatMessage(messages.address) }}</span>
<StyledInput
v-model="address"
:placeholder="formatMessage(messages.placeholderAddress)"
autocomplete="off"
wrapper-class="w-full"
/>
</label>
<label class="flex flex-col gap-2">
<span class="font-semibold text-contrast">{{ formatMessage(messages.resourcePack) }}</span>
<div class="w-[450px]">
<h2 class="text-lg font-extrabold text-contrast mt-0 mb-1">
{{ formatMessage(messages.name) }}
</h2>
<StyledInput
v-model="name"
:placeholder="formatMessage(messages.placeholderName)"
autocomplete="off"
wrapper-class="w-full"
/>
<h2 class="text-lg font-extrabold text-contrast mt-3 mb-1">
{{ formatMessage(messages.address) }}
</h2>
<StyledInput
v-model="address"
placeholder="example.modrinth.gg"
autocomplete="off"
wrapper-class="w-full"
/>
<h2 class="text-lg font-extrabold text-contrast mt-3 mb-1">
{{ formatMessage(messages.resourcePack) }}
</h2>
<div>
<Combobox
v-model="resourcePack"
:options="
@@ -95,9 +89,9 @@ defineExpose({ resourcePackOptions })
:display-value="
resourcePack
? formatMessage(resourcePackOptionMessages[resourcePack])
: formatMessage(messages.selectAnOption)
: 'Select an option'
"
/>
</label>
</div>
</div>
</template>
-6
View File
@@ -30,8 +30,6 @@ export type ServerWorld = BaseWorld & {
index: number
address: string
pack_status: ServerPackStatus
project_id?: string
content_kind?: string
}
export type World = SingleplayerWorld | ServerWorld
@@ -142,16 +140,12 @@ export async function add_server_to_profile(
name: string,
address: string,
packStatus: ServerPackStatus,
projectId?: string,
contentKind?: string,
): Promise<number> {
return await invoke('plugin:worlds|add_server_to_profile', {
path,
name,
address,
packStatus,
projectId,
contentKind,
})
}
+47 -5
View File
@@ -6,7 +6,7 @@
"message": "تعذر الوصول إلى خوادم المصادقة"
},
"app.export-modal.description-placeholder": {
"message": "أدخل وصف التعديل..."
"message": "ادخل وصف التعديل..."
},
"app.export-modal.export-button": {
"message": "تصدير"
@@ -41,14 +41,35 @@
"app.instance.confirm-delete.header": {
"message": "حذف المثيل"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "تم تثبيت حزمة التعديل هذه بالفعل في مثيل \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "حزمة تعديل مكررة"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "إنشاء على أي حال"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "انتقل إلى المثال"
},
"app.instance.modpack-already-installed.header": {
"message": "تم تثبيت حزمة التعديل بالفعل"
},
"app.instance.mods.content-type-project": {
"message": "مشروع"
},
"app.instance.mods.copy-link": {
"message": "نسخ الرابط"
},
"app.instance.mods.installing": {
"message": "جاري التثبيت..."
},
"app.instance.mods.modpack-fallback": {
"message": "حزمة التعديل"
},
"app.instance.mods.project-was-added": {
"message": "تمت إضافة \"{name}\""
"message": "تمت إضافة \"{name}\"."
},
"app.instance.mods.projects-were-added": {
"message": "تمت إضافة {count} من المشاريع"
@@ -59,9 +80,18 @@
"app.instance.mods.share-title": {
"message": "مشاركة محتوى حزمة التعديل"
},
"app.instance.mods.show-file": {
"message": "عرض الملف"
},
"app.instance.mods.successfully-uploaded": {
"message": "تم الرفع بنجاح"
},
"app.instance.mods.unknown-version": {
"message": "غير معروف"
},
"app.instance.mods.updating": {
"message": "جارٍ التحديث..."
},
"app.modal.install-to-play.content-required": {
"message": "المحتوى مطلوب"
},
@@ -72,7 +102,7 @@
"message": "تثبيت"
},
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {# تعديل} other {# تعديلات}}"
"message": ""
},
"app.modal.install-to-play.required-modpack": {
"message": "حزمة التعديل مطلوبة"
@@ -81,10 +111,10 @@
"message": "يتطلب هذا الخادم تعديلات للعب. انقر فوق \"تثبيت\" لإعداد الملفات المطلوبة من Modrinth، ثم قم بتشغيله مباشرة إلى الخادم."
},
"app.modal.install-to-play.shared-instance": {
"message": زمة مشتركة"
"message": ُزْمَة مشاركة"
},
"app.modal.install-to-play.shared-server-instance": {
"message": زمة خادم مشتركة"
"message": ُزْمَة خادم مشاركة"
},
"app.modal.install-to-play.view-contents": {
"message": "عرض المحتويات"
@@ -110,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "خيارات النسخة الافتراضية"
},
"app.settings.tabs.feature-flags": {
"message": "أعلام الميزات"
},
"app.settings.tabs.java-installations": {
"message": "تثبيتات جافا"
},
@@ -434,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "عدم العرض في الصفحة الرئيسية"
},
"instance.worlds.filter.available": {
"message": "متاح"
},
"instance.worlds.game_already_open": {
"message": "النسخة مفتوحة بالفعل"
},
@@ -458,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "تشغيل النسخة"
},
"instance.worlds.type.server": {
"message": "الخادم"
},
"instance.worlds.type.singleplayer": {
"message": "لعب فردي"
},
"instance.worlds.view_instance": {
"message": "عرض النسخة"
},
@@ -47,6 +47,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Výchozí možnosti instance"
},
"app.settings.tabs.feature-flags": {
"message": "Vlajky funkcí"
},
"app.settings.tabs.java-installations": {
"message": "Instalace Javy"
},
@@ -347,6 +350,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Nezobrazuje na domovské stránce"
},
"instance.worlds.filter.available": {
"message": "Dostupné"
},
"instance.worlds.game_already_open": {
"message": "Instance je již otevřená"
},
@@ -368,6 +374,12 @@
"instance.worlds.play_instance": {
"message": "Hrát instanci"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Hra pro jednoho hráče"
},
"instance.worlds.view_instance": {
"message": "Zobrazit instanci"
},
@@ -44,6 +44,15 @@
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Kopier link"
},
"app.instance.mods.installing": {
"message": "Installer..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" blev tilføjet"
},
@@ -56,9 +65,18 @@
"app.instance.mods.share-title": {
"message": "Deler modpack indhold"
},
"app.instance.mods.show-file": {
"message": "Vis filer"
},
"app.instance.mods.successfully-uploaded": {
"message": "Uploadet"
},
"app.instance.mods.unknown-version": {
"message": "Ukendt"
},
"app.instance.mods.updating": {
"message": "Opdatere..."
},
"app.modal.install-to-play.content-required": {
"message": "Indhold krævet"
},
@@ -107,6 +125,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Standardindstillinger for instans"
},
"app.settings.tabs.feature-flags": {
"message": "Funktionsflags"
},
"app.settings.tabs.java-installations": {
"message": "Javainstallationer"
},
@@ -431,6 +452,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Vis ikke på forsiden"
},
"instance.worlds.filter.available": {
"message": "Tilgængelig"
},
"instance.worlds.game_already_open": {
"message": "Instance allerede åben"
},
@@ -455,6 +479,12 @@
"instance.worlds.play_instance": {
"message": "Spil instance"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Singleplayer"
},
"instance.worlds.view_instance": {
"message": "Se instance"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Authentifizierungsserver sind nicht erreichbar"
},
"app.browse.add-server-to-instance": {
"message": "Server zu Instanz hinzufügen"
},
"app.browse.add-servers-to-instance": {
"message": "Server zu deiner Instanz hinzufügen"
},
"app.browse.add-to-instance": {
"message": "Zu Instanz hinzufügen"
},
"app.browse.add-to-instance-name": {
"message": "Zu {instanceName} hinzufügen"
},
"app.browse.added": {
"message": "Hinzugefügt"
},
"app.browse.already-added": {
"message": "Bereits hinzugefügt"
},
"app.browse.discover-content": {
"message": "Inhalte entdecken"
},
"app.browse.discover-servers": {
"message": "Server entdecken"
},
"app.browse.hide-added-servers": {
"message": "Hinzugefügte Server ausblenden"
},
"app.browse.hide-installed-content": {
"message": "Installierte Inhalte ausblenden"
},
"app.browse.install-content-to-instance": {
"message": "Inhalt in Instanz installieren"
},
"app.export-modal.description-placeholder": {
"message": "Modpaketbeschreibung eingeben..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Instanz löschen"
},
"app.instance.modpack-already-installed.body": {
"message": "Dieses Modpack ist bereits in der Instanz <bold>{instanceName}</bold> installiert. Möchtest du es wirklich duplizieren?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Dieses Modpack ist bereits in der Instanz {instanceName} installiert."
},
"app.instance.modpack-already-installed.create": {
"message": "Erstellen"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplizieren"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Trotzdem erstellen"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Gehe zu Instanz"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack bereits installiert"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instanz"
},
"app.instance.mods.content-type-project": {
"message": "Projekt"
},
"app.instance.mods.copy-link": {
"message": "Link kopieren"
},
"app.instance.mods.installing": {
"message": "Wird installiert..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpaket"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" wurde hinzugefügt"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Modpaketinhalte teilen"
},
"app.instance.mods.show-file": {
"message": "Datei anzeigen"
},
"app.instance.mods.successfully-uploaded": {
"message": "Erfolgreich hochgeladen"
},
"app.instance.worlds.add-server": {
"message": "Server hinzufügen"
"app.instance.mods.unknown-version": {
"message": "Unbekannt"
},
"app.instance.worlds.browse-servers": {
"message": "Server durchsuchen"
},
"app.instance.worlds.delete-world-description": {
"message": "„{name}“ wird **endgültig gelöscht**, und es gibt keine Möglichkeit, sie wiederherzustellen."
},
"app.instance.worlds.delete-world-title": {
"message": "Möchtest du diese Welt wirklich endgültig löschen?"
},
"app.instance.worlds.filter-modded": {
"message": "Modifiziert"
},
"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": "Füge einen Server hinzu oder durchsuche, um loszulegen"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Keine Server oder Welten hinzugefügt"
},
"app.instance.worlds.remove-server-description": {
"message": "„{name}“ wird aus deiner Liste entfernt, auch im Spiel, und es gibt keine Möglichkeit, ihn wiederherzustellen."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "„{name}“ ({address}) wird aus deiner Liste entfernt, inklusive im Spiel, und es gibt keine Möglichkeit, ihn wiederherzustellen."
},
"app.instance.worlds.remove-server-title": {
"message": "Möchtest du {name} wirklich entfernen?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Durchsuche {count} Welten..."
},
"app.instance.worlds.this-server": {
"message": "dieser Server"
"app.instance.mods.updating": {
"message": "Wird aktualisiert..."
},
"app.modal.install-to-play.content-required": {
"message": "Inhalte benötigt"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Standard Instanz-Einstellungen"
},
"app.settings.tabs.feature-flags": {
"message": "Funktionsflaggen"
},
"app.settings.tabs.java-installations": {
"message": "Java Installationen"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Lade neu um Aktualisierung zu installieren"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Wählen eine Option"
},
"app.world.world-item.incompatible-version": {
"message": "Inkompatible Version {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Noch nicht gespielt"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Freund hinzufügen"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Welt bearbeiten"
},
"instance.files.adding-files": {
"message": "Dateien werden hinzugefügt ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Speichern unter..."
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Nicht auf Startseite anzeigen"
},
"instance.worlds.filter.available": {
"message": "Verfügbar"
},
"instance.worlds.game_already_open": {
"message": "Instanz ist bereits geöffnet"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Instanz Spielen"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Einzelspieler"
},
"instance.worlds.view_instance": {
"message": "Instanz anzeigen"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Authentifizierungsserver sind nicht erreichbar"
},
"app.browse.add-server-to-instance": {
"message": "Server zu Instanz hinzufügen"
},
"app.browse.add-servers-to-instance": {
"message": "Server zu deiner Instanz hinzufügen"
},
"app.browse.add-to-instance": {
"message": "Zu Instanz hinzufügen"
},
"app.browse.add-to-instance-name": {
"message": "Zu {instanceName} hinzufügen"
},
"app.browse.added": {
"message": "Hinzugefügt"
},
"app.browse.already-added": {
"message": "Bereits hinzugefügt"
},
"app.browse.discover-content": {
"message": "Inhalte entdecken"
},
"app.browse.discover-servers": {
"message": "Server entdecken"
},
"app.browse.hide-added-servers": {
"message": "Hinzugefügte Server ausblenden"
},
"app.browse.hide-installed-content": {
"message": "Installierte Inhalte ausblenden"
},
"app.browse.install-content-to-instance": {
"message": "Inhalt in Instanz installieren"
},
"app.export-modal.description-placeholder": {
"message": "Beschreibung des Modpacks eingeben..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Instanz löschen"
},
"app.instance.modpack-already-installed.body": {
"message": "Dieses Modpack ist bereits in der Instanz <bold>{instanceName}</bold> installiert. Möchtest du es wirklich duplizieren?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Dieses Modpack ist bereits in der Instanz {instanceName} installiert."
},
"app.instance.modpack-already-installed.create": {
"message": "Erstellen"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplizieren"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Trotzdem erstellen"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Gehe zu Instanz"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack bereits installiert"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instanz"
},
"app.instance.mods.content-type-project": {
"message": "Projekt"
},
"app.instance.mods.copy-link": {
"message": "Link kopieren"
},
"app.instance.mods.installing": {
"message": "Wird installiert..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" wurde hinzugefügt"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Modpackinhalte teilen"
},
"app.instance.mods.show-file": {
"message": "Datei anzeigen"
},
"app.instance.mods.successfully-uploaded": {
"message": "Erfolgreich hochgeladen"
},
"app.instance.worlds.add-server": {
"message": "Server hinzufügen"
"app.instance.mods.unknown-version": {
"message": "Unbekannt"
},
"app.instance.worlds.browse-servers": {
"message": "Server durchsuchen"
},
"app.instance.worlds.delete-world-description": {
"message": "„{name}“ wird **endgültig gelöscht**, und es gibt keine Möglichkeit, sie wiederherzustellen."
},
"app.instance.worlds.delete-world-title": {
"message": "Möchtest du diese Welt wirklich endgültig löschen?"
},
"app.instance.worlds.filter-modded": {
"message": "Modifiziert"
},
"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": "Füge einen Server hinzu oder durchsuche, um loszulegen"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Keine Server oder Welten hinzugefügt"
},
"app.instance.worlds.remove-server-description": {
"message": "„{name}“ wird aus deiner Liste entfernt, auch im Spiel, und es gibt keine Möglichkeit, ihn wiederherzustellen."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "„{name}“ ({address}) wird aus deiner Liste entfernt, inklusive im Spiel, und es gibt keine Möglichkeit, ihn wiederherzustellen."
},
"app.instance.worlds.remove-server-title": {
"message": "Möchtest du {name} wirklich entfernen?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Durchsuche {count} Welten..."
},
"app.instance.worlds.this-server": {
"message": "dieser Server"
"app.instance.mods.updating": {
"message": "Wird aktualisiert..."
},
"app.modal.install-to-play.content-required": {
"message": "Inhalte benötigt"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Standard Instanz-Einstellungen"
},
"app.settings.tabs.feature-flags": {
"message": "Funktionsflags"
},
"app.settings.tabs.java-installations": {
"message": "Java-Installationen"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Neu laden, um das Update zu installieren"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Wählen eine Option"
},
"app.world.world-item.incompatible-version": {
"message": "Inkompatible Version {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Noch nicht gespielt"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Freund hinzufügen"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Welt bearbeiten"
},
"instance.files.adding-files": {
"message": "Dateien werden hinzugefügt ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Speichern unter..."
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Nicht auf der Startseite anzeigen"
},
"instance.worlds.filter.available": {
"message": "Verfügbar"
},
"instance.worlds.game_already_open": {
"message": "Instanz ist bereits geöffnet"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Instanz spielen"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Einzelspieler"
},
"instance.worlds.view_instance": {
"message": "Instanz anzeigen"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Cannot reach authentication servers"
},
"app.browse.add-server-to-instance": {
"message": "Add server to instance"
},
"app.browse.add-servers-to-instance": {
"message": "Add servers to your instance"
},
"app.browse.add-to-instance": {
"message": "Add to instance"
},
"app.browse.add-to-instance-name": {
"message": "Add to {instanceName}"
},
"app.browse.added": {
"message": "Added"
},
"app.browse.already-added": {
"message": "Already added"
},
"app.browse.discover-content": {
"message": "Discover content"
},
"app.browse.discover-servers": {
"message": "Discover servers"
},
"app.browse.hide-added-servers": {
"message": "Hide added servers"
},
"app.browse.hide-installed-content": {
"message": "Hide installed content"
},
"app.browse.install-content-to-instance": {
"message": "Install content to instance"
},
"app.export-modal.description-placeholder": {
"message": "Enter modpack description..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Delete instance"
},
"app.instance.modpack-already-installed.body": {
"message": "This modpack is already installed in the <bold>{instanceName}</bold> instance. Are you sure you want to duplicate it?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "This modpack is already installed in the \"{instanceName}\" instance."
},
"app.instance.modpack-already-installed.create": {
"message": "Create"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Duplicate modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Create anyway"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Go to instance"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack already installed"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instance"
},
"app.instance.mods.content-type-project": {
"message": "project"
},
"app.instance.mods.copy-link": {
"message": "Copy link"
},
"app.instance.mods.installing": {
"message": "Installing..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" was added"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Sharing modpack content"
},
"app.instance.mods.show-file": {
"message": "Show file"
},
"app.instance.mods.successfully-uploaded": {
"message": "Successfully uploaded"
},
"app.instance.worlds.add-server": {
"message": "Add server"
"app.instance.mods.unknown-version": {
"message": "Unknown"
},
"app.instance.worlds.browse-servers": {
"message": "Browse servers"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' will be **permanently deleted**, and there will be no way to recover it."
},
"app.instance.worlds.delete-world-title": {
"message": "Are you sure you want to permanently delete this world?"
},
"app.instance.worlds.filter-modded": {
"message": "Modded"
},
"app.instance.worlds.filter-offline": {
"message": "Offline"
},
"app.instance.worlds.filter-online": {
"message": "Online"
},
"app.instance.worlds.filter-vanilla": {
"message": "Vanilla"
},
"app.instance.worlds.no-worlds-description": {
"message": "Add a server or browse to get started"
},
"app.instance.worlds.no-worlds-heading": {
"message": "No servers or worlds added"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' will be removed from your list, including in-game, and there will be no way to recover it."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) will be removed from your list, including in-game, and there will be no way to recover it."
},
"app.instance.worlds.remove-server-title": {
"message": "Are you sure you want to remove {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Search {count} worlds..."
},
"app.instance.worlds.this-server": {
"message": "this server"
"app.instance.mods.updating": {
"message": "Updating..."
},
"app.modal.install-to-play.content-required": {
"message": "Content required"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Default instance options"
},
"app.settings.tabs.feature-flags": {
"message": "Feature flags"
},
"app.settings.tabs.java-installations": {
"message": "Java installations"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Reload to install update"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Select an option"
},
"app.world.world-item.incompatible-version": {
"message": "Incompatible version {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Not played yet"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Add a friend"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Edit world"
},
"instance.files.adding-files": {
"message": "Adding files ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Save as..."
},
"instance.server-modal.address": {
"message": "Address"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Don't show on Home"
},
"instance.worlds.filter.available": {
"message": "Available"
},
"instance.worlds.game_already_open": {
"message": "Instance is already open"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Play instance"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Singleplayer"
},
"instance.worlds.view_instance": {
"message": "View instance"
},
+48 -117
View File
@@ -5,41 +5,8 @@
"app.auth-servers.unreachable.header": {
"message": "No se puede acceder a los servidores de autenticación"
},
"app.browse.add-server-to-instance": {
"message": "Añadir servidor a la instancia"
},
"app.browse.add-servers-to-instance": {
"message": "Añadir servidor a tu instancia"
},
"app.browse.add-to-instance": {
"message": "Añadir a la instancia"
},
"app.browse.add-to-instance-name": {
"message": "Añadir a {instanceName}"
},
"app.browse.added": {
"message": "Añadido"
},
"app.browse.already-added": {
"message": "Ya está añadido"
},
"app.browse.discover-content": {
"message": "Descubrir contenido"
},
"app.browse.discover-servers": {
"message": "Descubrir servidores"
},
"app.browse.hide-added-servers": {
"message": "Ocultar servidores añadidos"
},
"app.browse.hide-installed-content": {
"message": "Ocultar contenido instalado"
},
"app.browse.install-content-to-instance": {
"message": "Instalar contenido a una instancia"
},
"app.export-modal.description-placeholder": {
"message": "Colocá la descripción del modpack..."
"message": "Escribe la descripción del modpack..."
},
"app.export-modal.export-button": {
"message": "Exportar"
@@ -54,16 +21,16 @@
"message": "Nombre del modpack"
},
"app.export-modal.select-files-label": {
"message": "Selelecciona archivos y carpetas para incluir en el pack"
"message": "Seleccione archivos y carpetas para incluir en el paquete"
},
"app.export-modal.version-number-label": {
"message": "Nombre de la versión"
"message": "Número de versión"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Todos los datos de tu instancia se eliminarán permanentemente, incluidos tus mundos, configuraciones y todo el contenido instalado."
"message": "Todos los datos de su instancia se eliminarán permanentemente, incluidos sus mundos, configuraciones y todo el contenido instalado."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Esta acción no se puede deshacer"
@@ -74,80 +41,56 @@
"app.instance.confirm-delete.header": {
"message": "Eliminar instancia"
},
"app.instance.modpack-already-installed.body": {
"message": "Este modpack ya está instalado en la instancia <bold>{instanceName}</bold>. ¿Estás seguro qué quieres duplicarlo?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Este modpack ya está instalado en la instancia \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Crear"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplicado"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Crea de todos modos"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ir a la instancia"
},
"app.instance.modpack-already-installed.header": {
"message": "Este modpack ya esta instalado"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instancia"
"message": "Modpack ya está instalado"
},
"app.instance.mods.content-type-project": {
"message": "proyecto"
},
"app.instance.mods.copy-link": {
"message": "Copiar enlace"
},
"app.instance.mods.installing": {
"message": "Instalando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" fue añadido"
"message": "Se ha añadido \"{name}\""
},
"app.instance.mods.projects-were-added": {
"message": "Se agregaron {count} proyectos"
"message": "Se han añadido {count} proyectos"
},
"app.instance.mods.share-text": {
"message": "¡Echa un vistazo a los proyectos que estoy usando en mi paquete de mods!"
"message": "¡Echa un vistazo a los proyectos que utilizo en mi modpack!"
},
"app.instance.mods.share-title": {
"message": "Compartiendo contenido del modpack"
"message": "Compartir contenido del modpack"
},
"app.instance.mods.show-file": {
"message": "Mostrar archivo"
},
"app.instance.mods.successfully-uploaded": {
"message": "Subido correctamente"
"message": "Se ha subido correctamente"
},
"app.instance.worlds.add-server": {
"message": "Añadir servidor"
"app.instance.mods.unknown-version": {
"message": "Desconocido"
},
"app.instance.worlds.browse-servers": {
"message": "Explorar servidores"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' será **permanentemente eliminado**, y habrá forma de recuperarlo."
},
"app.instance.worlds.delete-world-title": {
"message": "¿Estás seguro de qué quieres eliminar permanentemente este mundo?"
},
"app.instance.worlds.filter-modded": {
"message": "Modeado"
},
"app.instance.worlds.filter-offline": {
"message": "Sin conexión"
},
"app.instance.worlds.filter-online": {
"message": "En línea"
},
"app.instance.worlds.filter-vanilla": {
"message": "Vanilla"
},
"app.instance.worlds.no-worlds-description": {
"message": "Añadir un servidor o explora para comenzar"
},
"app.instance.worlds.no-worlds-heading": {
"message": "No hay servidores o mundos añadidos"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' será eliminado de tu lista, incluyendo dentro del juego, y no habrá forma de recuperarlo."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) será eliminado de tu lista, incluyendo dentro del juego, y no habrá forma de recuperarlo."
},
"app.instance.worlds.remove-server-title": {
"message": "¿Estás seguro de qué quieres eliminar {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Buscar {count} mundos..."
},
"app.instance.worlds.this-server": {
"message": "este servidor"
"app.instance.mods.updating": {
"message": "Actualizando..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenido requerido"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Opciones predeterminadas de la instancia"
},
"app.settings.tabs.feature-flags": {
"message": "Funciones experimentales"
},
"app.settings.tabs.java-installations": {
"message": "Instalaciones de Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Recarga para instalar la actualización"
},
"app.world.server-modal.placeholder-address": {
"message": "ejemplo.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Selecciona una opción"
},
"app.world.world-item.incompatible-version": {
"message": "Versión {version} incompatible"
},
"app.world.world-item.not-played-yet": {
"message": "No se ha jugado aún"
},
"app.world.world-item.offline": {
"message": "Desconectado"
},
"app.world.world-item.players-online": {
"message": "{count} en línea"
},
"friends.action.add-friend": {
"message": "Añadir un amigo"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.files.adding-files": {
"message": "Añadiendo archivos ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Guardar como..."
},
"instance.server-modal.address": {
"message": "Dirección IP"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "No mostrar en la página de inicio"
},
"instance.worlds.filter.available": {
"message": "Disponible"
},
"instance.worlds.game_already_open": {
"message": "La instancia ya está abierta"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Iniciar instancia"
},
"instance.worlds.type.server": {
"message": "Servidor"
},
"instance.worlds.type.singleplayer": {
"message": "Un jugador"
},
"instance.worlds.view_instance": {
"message": "Ver instancia"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "No se puede conectar con los servidores de autenticación"
},
"app.browse.add-server-to-instance": {
"message": "Añadir servidor a la instancia"
},
"app.browse.add-servers-to-instance": {
"message": "Añadir servidor a tu instancia"
},
"app.browse.add-to-instance": {
"message": "Añadir a la instancia"
},
"app.browse.add-to-instance-name": {
"message": "Añadir a {instanceName}"
},
"app.browse.added": {
"message": "Añadido"
},
"app.browse.already-added": {
"message": "Ya está añadido"
},
"app.browse.discover-content": {
"message": "Descubrir contenido"
},
"app.browse.discover-servers": {
"message": "Descubrir servidores"
},
"app.browse.hide-added-servers": {
"message": "Ocultar servidores añadidos"
},
"app.browse.hide-installed-content": {
"message": "Ocultar contenido instalado"
},
"app.browse.install-content-to-instance": {
"message": "Instalar contenido a una instancia"
},
"app.export-modal.description-placeholder": {
"message": "Escribe la descripción del modpack..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Eliminar instancia"
},
"app.instance.modpack-already-installed.body": {
"message": "Este modpack ya está instalado en la instancia <bold>{instanceName}</bold>. ¿Estás seguro qué quieres duplicarlo?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Este modpack ya está instalado en la instancia \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Crear"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modpack duplicado"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Crea de todos modos"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ir a la instancia"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack ya está instalado"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instancia"
},
"app.instance.mods.content-type-project": {
"message": "proyecto"
},
"app.instance.mods.copy-link": {
"message": "Copiar enlace"
},
"app.instance.mods.installing": {
"message": "Instalando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "Se ha añadido \"{name}\""
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Compartir contenido del modpack"
},
"app.instance.mods.show-file": {
"message": "Mostrar archivo"
},
"app.instance.mods.successfully-uploaded": {
"message": "Se ha subido correctamente"
},
"app.instance.worlds.add-server": {
"message": "Añadir servidor"
"app.instance.mods.unknown-version": {
"message": "Desconocido"
},
"app.instance.worlds.browse-servers": {
"message": "Explorar servidores"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' será **permanentemente eliminado**, y habrá forma de recuperarlo."
},
"app.instance.worlds.delete-world-title": {
"message": "¿Estás seguro de qué quieres eliminar permanentemente este mundo?"
},
"app.instance.worlds.filter-modded": {
"message": "Modeado"
},
"app.instance.worlds.filter-offline": {
"message": "Sin conexión"
},
"app.instance.worlds.filter-online": {
"message": "En línea"
},
"app.instance.worlds.filter-vanilla": {
"message": "Vanilla"
},
"app.instance.worlds.no-worlds-description": {
"message": "Añadir un servidor o explora para comenzar"
},
"app.instance.worlds.no-worlds-heading": {
"message": "No hay servidores o mundos añadidos"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' será eliminado de tu lista, incluyendo dentro del juego, y no habrá forma de recuperarlo."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) será eliminado de tu lista, incluyendo dentro del juego, y no habrá forma de recuperarlo."
},
"app.instance.worlds.remove-server-title": {
"message": "¿Estás seguro de qué quieres eliminar {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Buscar {count} mundos..."
},
"app.instance.worlds.this-server": {
"message": "este servidor"
"app.instance.mods.updating": {
"message": "Actualizando..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenido obligatorio"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Opciones predeterminadas de la instancia"
},
"app.settings.tabs.feature-flags": {
"message": "Funciones experimentales"
},
"app.settings.tabs.java-installations": {
"message": "Instalaciones de Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Recarga para instalar la actualización"
},
"app.world.server-modal.placeholder-address": {
"message": "ejemplo.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Selecciona una opción"
},
"app.world.world-item.incompatible-version": {
"message": "Versión {version} incompatible"
},
"app.world.world-item.not-played-yet": {
"message": "No se ha jugado aún"
},
"app.world.world-item.offline": {
"message": "Desconectado"
},
"app.world.world-item.players-online": {
"message": "{count} en línea"
},
"friends.action.add-friend": {
"message": "Agrega a un amigo"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.files.adding-files": {
"message": "Añadiendo archivos ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Guardar como..."
},
"instance.server-modal.address": {
"message": "Dirección IP"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "No mostrar en Inicio"
},
"instance.worlds.filter.available": {
"message": "Disponible"
},
"instance.worlds.game_already_open": {
"message": "La instancia ya está abierta"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Jugar instancia"
},
"instance.worlds.type.server": {
"message": "Servidor"
},
"instance.worlds.type.singleplayer": {
"message": "Un jugador"
},
"instance.worlds.view_instance": {
"message": "Ver instancia"
},
@@ -71,6 +71,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Oletusinstanssin asetukset"
},
"app.settings.tabs.feature-flags": {
"message": "Ominaisuuskytkimet"
},
"app.settings.tabs.java-installations": {
"message": "Java asennukset"
},
@@ -395,6 +398,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Älä näytä koti näkymässä"
},
"instance.worlds.filter.available": {
"message": "Saatavilla"
},
"instance.worlds.game_already_open": {
"message": "Instanssi on jo avattu"
},
@@ -419,6 +425,12 @@
"instance.worlds.play_instance": {
"message": "Pelaa instanssia"
},
"instance.worlds.type.server": {
"message": "Palvelin"
},
"instance.worlds.type.singleplayer": {
"message": "Yksinpeli"
},
"instance.worlds.view_instance": {
"message": "Näytä instanssi"
},
@@ -26,9 +26,18 @@
"app.instance.mods.content-type-project": {
"message": "proyekto"
},
"app.instance.mods.copy-link": {
"message": "Kopyahin ang link"
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "Ang \"{name}\" ay nadagdag"
},
"app.instance.mods.unknown-version": {
"message": "Hindi kilala"
},
"app.modal.install-to-play.content-required": {
"message": "Nangangailangan ng kontento"
},
@@ -77,6 +86,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Mga pagpipilian sa default na instansiya"
},
"app.settings.tabs.feature-flags": {
"message": "Mga hudyat ng tampok"
},
"app.settings.tabs.java-installations": {
"message": "Mga instalasyon ng Java"
},
@@ -401,6 +413,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Huwag ipakita sa Home"
},
"instance.worlds.filter.available": {
"message": "Magagamit"
},
"instance.worlds.game_already_open": {
"message": "Bukas naman ang instansiya"
},
@@ -425,6 +440,12 @@
"instance.worlds.play_instance": {
"message": "Laruin ang instansiya"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Pang-isahang laro"
},
"instance.worlds.view_instance": {
"message": "Tingnan ang instansiya"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Impossible de contacter les serveurs d'authentification"
},
"app.browse.add-server-to-instance": {
"message": "Ajouter le serveur a l'instance"
},
"app.browse.add-servers-to-instance": {
"message": "Ajouter des serveurs a votre instance"
},
"app.browse.add-to-instance": {
"message": "Ajouter à l'instance"
},
"app.browse.add-to-instance-name": {
"message": "Ajouter à {instanceName}"
},
"app.browse.added": {
"message": "Ajouté"
},
"app.browse.already-added": {
"message": "Déjà ajouté"
},
"app.browse.discover-content": {
"message": "Découvrir du contenu"
},
"app.browse.discover-servers": {
"message": "Découvrir des serveurs"
},
"app.browse.hide-added-servers": {
"message": "Masquer les serveurs ajoutés"
},
"app.browse.hide-installed-content": {
"message": "Masquer le contenu installé"
},
"app.browse.install-content-to-instance": {
"message": "Installer du contenu à l'instance"
},
"app.export-modal.description-placeholder": {
"message": "Saisir la description du modpack..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Supprimer l'instance"
},
"app.instance.modpack-already-installed.body": {
"message": "Ce modpack est déjà installé sur l'instance <bold>{instanceName}</bold>. Êtes-vous sûr.e de vouloir le dupliquer ?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Ce modpack est déjà installé dans linstance « {instanceName} »."
},
"app.instance.modpack-already-installed.create": {
"message": "Créer"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Dupliquer le modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Créer quand même"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Aller à linstance"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack déjà installé"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instance"
},
"app.instance.mods.content-type-project": {
"message": "projet"
},
"app.instance.mods.copy-link": {
"message": "Copier le lien"
},
"app.instance.mods.installing": {
"message": "Installation..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "« {name} » a été ajouté"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Partagez le contenu de votre modpack"
},
"app.instance.mods.show-file": {
"message": "Montrer le fichier"
},
"app.instance.mods.successfully-uploaded": {
"message": "Mis en ligne avec succès"
},
"app.instance.worlds.add-server": {
"message": "Ajouter le serveur"
"app.instance.mods.unknown-version": {
"message": "Inconnu"
},
"app.instance.worlds.browse-servers": {
"message": "Parcourir des serveurs"
},
"app.instance.worlds.delete-world-description": {
"message": "« {name} » sera supprimé **pour toujours**, et il sera impossible de le récupérer."
},
"app.instance.worlds.delete-world-title": {
"message": "Étes-vous sûr.e de vouloir supprimer ce monde pour toujours ?"
},
"app.instance.worlds.filter-modded": {
"message": "Moddé"
},
"app.instance.worlds.filter-offline": {
"message": "Hors ligne"
},
"app.instance.worlds.filter-online": {
"message": "En ligne"
},
"app.instance.worlds.filter-vanilla": {
"message": "Vanilla"
},
"app.instance.worlds.no-worlds-description": {
"message": "Ajouter un serveur ou parcourir pour commencer"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Aucun serveur ou monde ajoutés"
},
"app.instance.worlds.remove-server-description": {
"message": "« {name} » sera retiré de votre liste, y compris en jeu, et il sera impossible de le récupérer."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "« {name} » ({address}) sera retiré de votre liste, y compris en jeu, et il sera impossible de le récupérer."
},
"app.instance.worlds.remove-server-title": {
"message": "Êtes-vous sûr.e de vouloir retirer {name} ?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Rechercher {count} mondes..."
},
"app.instance.worlds.this-server": {
"message": "ce serveur"
"app.instance.mods.updating": {
"message": "Mise à jour..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenu requis"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Options dinstance par défaut"
},
"app.settings.tabs.feature-flags": {
"message": "Menu de fonctionnalité"
},
"app.settings.tabs.java-installations": {
"message": "Installations de Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Relancez l'application pour installer la mise à jour"
},
"app.world.server-modal.placeholder-address": {
"message": "exemple.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Sélectionner une option"
},
"app.world.world-item.incompatible-version": {
"message": "Version {version} incompatible"
},
"app.world.world-item.not-played-yet": {
"message": "Pas encore joué"
},
"app.world.world-item.offline": {
"message": "Hors ligne"
},
"app.world.world-item.players-online": {
"message": "{count, plural, =0 {Personne en ligne} one {# est en ligne} other {# sont en ligne}}"
},
"friends.action.add-friend": {
"message": "Ajouter un ami"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Modifier le monde"
},
"instance.files.adding-files": {
"message": "Ajout de fichiers ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Sauvegarder en tant que..."
},
"instance.server-modal.address": {
"message": "Adresse"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Ne pas montrer dans l'Accueil"
},
"instance.worlds.filter.available": {
"message": "Disponible"
},
"instance.worlds.game_already_open": {
"message": "L'instance est déjà ouverte"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Jouer à l'instance"
},
"instance.worlds.type.server": {
"message": "Serveur"
},
"instance.worlds.type.singleplayer": {
"message": "Solo"
},
"instance.worlds.view_instance": {
"message": "Voir l'instance"
},
+28 -16
View File
@@ -5,9 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "לא ניתן לגשת לשרתי האימות"
},
"app.browse.hide-installed-content": {
"message": "הסתר תוכן מותקן"
},
"app.export-modal.description-placeholder": {
"message": "הזן את תיאור חבילת המודים..."
},
@@ -44,12 +41,18 @@
"app.instance.confirm-delete.header": {
"message": "מחיקת התקנה"
},
"app.instance.modpack-already-installed.create": {
"message": "צור"
},
"app.instance.mods.content-type-project": {
"message": "פרויקט"
},
"app.instance.mods.copy-link": {
"message": "העתק קישור"
},
"app.instance.mods.installing": {
"message": "מתקין..."
},
"app.instance.mods.modpack-fallback": {
"message": "חבילת מודים"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" נוסף"
},
@@ -62,17 +65,17 @@
"app.instance.mods.share-title": {
"message": "משתף את התוכן של חבילת המודים"
},
"app.instance.mods.show-file": {
"message": "מצא קובץ"
},
"app.instance.mods.successfully-uploaded": {
"message": "הועלה בהצלחה"
},
"app.instance.worlds.add-server": {
"message": "הוסף שרת"
"app.instance.mods.unknown-version": {
"message": "לא ידוע"
},
"app.instance.worlds.delete-world-title": {
"message": "האם אתה בטוח שברצונך למחוק לצמיתות את העולם הזה?"
},
"app.instance.worlds.no-worlds-heading": {
"message": "אין שרתים אן עולמות שנוספו"
"app.instance.mods.updating": {
"message": "מעדכן..."
},
"app.modal.install-to-play.content-required": {
"message": "תוכן נדרש"
@@ -122,6 +125,9 @@
"app.settings.tabs.default-instance-options": {
"message": "אפשרויות ברירת מחדל של התקנה"
},
"app.settings.tabs.feature-flags": {
"message": "הגדרות ניסיוניות"
},
"app.settings.tabs.java-installations": {
"message": "התקנות ג'אווה"
},
@@ -275,9 +281,6 @@
"instance.edit-world.title": {
"message": "ערוך עולם"
},
"instance.files.save-as": {
"message": "שמור כ..."
},
"instance.server-modal.address": {
"message": "כתובת"
},
@@ -449,6 +452,9 @@
"instance.worlds.dont_show_on_home": {
"message": "אל תציג בדף הבית"
},
"instance.worlds.filter.available": {
"message": "זמין"
},
"instance.worlds.game_already_open": {
"message": "התקנה כבר פתוחה"
},
@@ -473,6 +479,12 @@
"instance.worlds.play_instance": {
"message": "שחק בהתקנה"
},
"instance.worlds.type.server": {
"message": "שרת"
},
"instance.worlds.type.singleplayer": {
"message": "שחקן יחיד"
},
"instance.worlds.view_instance": {
"message": "הצג התקנה"
},
+42 -105
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Nem lehet elérni a hitelesítési kiszolgálókat"
},
"app.browse.add-server-to-instance": {
"message": "Szerver hozzáadása a profilhoz"
},
"app.browse.add-servers-to-instance": {
"message": "Szerverek hozzáadása a profilodhoz"
},
"app.browse.add-to-instance": {
"message": "Hozzáadás a profilhoz"
},
"app.browse.add-to-instance-name": {
"message": "Hozzáadás ehhez: {instanceName}"
},
"app.browse.added": {
"message": "Hozzáadva"
},
"app.browse.already-added": {
"message": "Már hozzá van adva"
},
"app.browse.discover-content": {
"message": "Tartalom böngészése"
},
"app.browse.discover-servers": {
"message": "Szerverek böngészése"
},
"app.browse.hide-added-servers": {
"message": "Hozzáadott szerverek elrejtése"
},
"app.browse.hide-installed-content": {
"message": "A telepített tartalmak elrejtése"
},
"app.browse.install-content-to-instance": {
"message": "Tartalom letöltése a profilhoz"
},
"app.export-modal.description-placeholder": {
"message": "Írd be a modcsomag leírását..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Profil törlése"
},
"app.instance.modpack-already-installed.body": {
"message": "Ez a modcsomag már telepítve van a(z) <bold>{instanceName}</bold> profilban. Biztosan duplikálni szeretnéd?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Ez a modcsomag már telepítve van a{instanceName} profilban."
},
"app.instance.modpack-already-installed.create": {
"message": "Létrehozás"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Modcsomag duplikálása"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Létrehozás mindenképpen"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Profil megnyitása"
},
"app.instance.modpack-already-installed.header": {
"message": "A modcsomag már telepítve van"
},
"app.instance.modpack-already-installed.instance": {
"message": "Profil"
},
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Link másolása"
},
"app.instance.mods.installing": {
"message": "Telepítés..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modcsomag"
},
"app.instance.mods.project-was-added": {
"message": " „{name}” hozzá lett adva"
},
@@ -101,47 +80,17 @@
"app.instance.mods.share-title": {
"message": "Modcsomag-tartalmak megosztása"
},
"app.instance.mods.show-file": {
"message": "Fájl megjelenítése"
},
"app.instance.mods.successfully-uploaded": {
"message": "Sikeresen feltöltve"
},
"app.instance.worlds.add-server": {
"message": "Szerver hozzáadása"
"app.instance.mods.unknown-version": {
"message": "Ismeretlen"
},
"app.instance.worlds.browse-servers": {
"message": "Szerverek böngészése"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' **véglegesen törlődik**, és azt semmilyen módon nem lehet majd helyreállítani."
},
"app.instance.worlds.delete-world-title": {
"message": "Biztosan véglegesen törölni szeretnéd ezt a világot?"
},
"app.instance.worlds.filter-modded": {
"message": "Modolt"
},
"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": "Kezdéshez adj hozzá egy szervert, vagy böngéssz"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Nincs szerver vagy világ"
},
"app.instance.worlds.remove-server-title": {
"message": "Biztosan el akarod távolítani ezt: {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Keresés {count} világ között..."
},
"app.instance.worlds.this-server": {
"message": "ez a szerver"
"app.instance.mods.updating": {
"message": "Frissítés..."
},
"app.modal.install-to-play.content-required": {
"message": "Szükséges tartalom"
@@ -153,7 +102,7 @@
"message": "Telepítés"
},
"app.modal.install-to-play.mod-count": {
"message": "{count} mod"
"message": "{count, plural,one {# mod}other {# modok}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Szükséges modcsomag"
@@ -191,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Alapértelmezett profil beállítások"
},
"app.settings.tabs.feature-flags": {
"message": "Funkciójelzők"
},
"app.settings.tabs.java-installations": {
"message": "Telepített Java példányok"
},
@@ -245,24 +197,6 @@
"app.update.reload-to-update": {
"message": "A telepítéshez újraindítás szükséges"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Válassz egy lehetőséget"
},
"app.world.world-item.incompatible-version": {
"message": "Inkompatibilis verzió: {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Még nem játszottál"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Barát hozzáadása"
},
@@ -362,12 +296,6 @@
"instance.edit-world.title": {
"message": "Világ szerkesztése"
},
"instance.files.adding-files": {
"message": "Fájlok hozzáadása ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Mentés másként..."
},
"instance.server-modal.address": {
"message": "Cím"
},
@@ -539,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Ne mutasd a kezdőlapon"
},
"instance.worlds.filter.available": {
"message": "Elérhető"
},
"instance.worlds.game_already_open": {
"message": "A profil már meg van nyitva"
},
@@ -563,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Játék a profillal"
},
"instance.worlds.type.server": {
"message": "Szerver"
},
"instance.worlds.type.singleplayer": {
"message": "Egyjátékos"
},
"instance.worlds.view_instance": {
"message": "Profil megtekintése"
},
@@ -576,13 +513,13 @@
"message": "A játékverzió a profil által van megadva"
},
"search.filter.locked.instance-loader.title": {
"message": "A betöltő a profil által van megadva"
"message": "A modbetöltő a profil által van megadva"
},
"search.filter.locked.instance.sync": {
"message": "Profil szinkronizálása"
},
"search.filter.locked.server": {
"message": "A szerver által van megadva"
"message": "A szerver biztosítja"
},
"search.filter.locked.server-environment.title": {
"message": "Csak kliensoldali modok adhatók hozzá a szerverprofilhoz"
@@ -591,6 +528,6 @@
"message": "A játékverziót a szerver biztosítja"
},
"search.filter.locked.server-loader.title": {
"message": "A betöltő a szerver által van megadva"
"message": "A betöltőt a szerver biztosítja"
}
}
@@ -41,12 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Hapus instans"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Paket mod ini telah terpasang pada instans \"{instanceName}\"."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Gandakan paket mod"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Tetap buat"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Pergi ke instans"
},
"app.instance.modpack-already-installed.header": {
"message": "Paket mod telah terpasang"
},
"app.instance.mods.content-type-project": {
"message": "proyek"
},
"app.instance.mods.copy-link": {
"message": "Salin tautan"
},
"app.instance.mods.installing": {
"message": "Memasang..."
},
"app.instance.mods.modpack-fallback": {
"message": "Paket Mod"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" telah ditambahkan"
},
@@ -59,9 +80,18 @@
"app.instance.mods.share-title": {
"message": "Membagi konten paket mod"
},
"app.instance.mods.show-file": {
"message": "Tampilkan berkas"
},
"app.instance.mods.successfully-uploaded": {
"message": "Berhasil diunggah"
},
"app.instance.mods.unknown-version": {
"message": "Tidak diketahui"
},
"app.instance.mods.updating": {
"message": "Memperbarui..."
},
"app.modal.install-to-play.content-required": {
"message": "Konten diperlukan"
},
@@ -110,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Pilihan instans bawaan"
},
"app.settings.tabs.feature-flags": {
"message": "Bendera fitur"
},
"app.settings.tabs.java-installations": {
"message": "Pemasangan Java"
},
@@ -434,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Jangan tampilkan di Beranda"
},
"instance.worlds.filter.available": {
"message": "Tersedia"
},
"instance.worlds.game_already_open": {
"message": "Instans telah dibuka"
},
@@ -458,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Mainkan instans"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Bermain sendiri"
},
"instance.worlds.view_instance": {
"message": "Lihat instans"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Impossibile raggiungere i server di autenticazione"
},
"app.browse.add-server-to-instance": {
"message": "Aggiungi server all'istanza"
},
"app.browse.add-servers-to-instance": {
"message": "Aggiungi server alla tua istanza"
},
"app.browse.add-to-instance": {
"message": "Aggiungi all'istanza"
},
"app.browse.add-to-instance-name": {
"message": "Aggiungi a {instanceName}"
},
"app.browse.added": {
"message": "Aggiunto"
},
"app.browse.already-added": {
"message": "Già aggiunto"
},
"app.browse.discover-content": {
"message": "Esplora contenuti"
},
"app.browse.discover-servers": {
"message": "Esplora i server"
},
"app.browse.hide-added-servers": {
"message": "Nascondi server aggiunti"
},
"app.browse.hide-installed-content": {
"message": "Nascondi contenuti installati"
},
"app.browse.install-content-to-instance": {
"message": "Installa nella istanza"
},
"app.export-modal.description-placeholder": {
"message": "Inserisci descrizione del pacchetto..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Elimina istanza"
},
"app.instance.modpack-already-installed.body": {
"message": "Questo pacchetto di mod è già installato nell'istanza <bold>{instanceName}</bold>. Vuoi davvero duplicarlo?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Questo pacchetto è già stato installato nell'istanza \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Crea"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Pacchetto duplicato"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Crea comunque"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Vai all'istanza"
},
"app.instance.modpack-already-installed.header": {
"message": "Pacchetto già installato"
},
"app.instance.modpack-already-installed.instance": {
"message": "Istanza"
},
"app.instance.mods.content-type-project": {
"message": "progetto"
},
"app.instance.mods.copy-link": {
"message": "Copia link"
},
"app.instance.mods.installing": {
"message": "Installando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Pacchetto di mod"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" è stato aggiunto"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Condivisione del pacchetto"
},
"app.instance.mods.show-file": {
"message": "Mostra file"
},
"app.instance.mods.successfully-uploaded": {
"message": "Caricato con successo"
},
"app.instance.worlds.add-server": {
"message": "Aggiungi server"
"app.instance.mods.unknown-version": {
"message": "Sconosciuta"
},
"app.instance.worlds.browse-servers": {
"message": "Esplora i server"
},
"app.instance.worlds.delete-world-description": {
"message": "\"{name}\" verrà eliminato permanentemente e non ci sarà modo di recuperarlo."
},
"app.instance.worlds.delete-world-title": {
"message": "Vuoi davvero eliminare permanentemente questo mondo?"
},
"app.instance.worlds.filter-modded": {
"message": "Moddato"
},
"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": "Inizia esplorando o aggiungendo un server"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Nessun server o mondi aggiunti"
},
"app.instance.worlds.remove-server-description": {
"message": "\"{name}\" sarà rimosso dalla tua lista, inclusa quella in-gioco, e non ci sarà modo di recuperarlo."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "\"{name}\" ({address}) sarà rimosso dalla tua lista, inclusa quella in-gioco, e non ci sarà modo di recuperarlo."
},
"app.instance.worlds.remove-server-title": {
"message": "Vuoi davvero rimuovere {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Cerca tra {count} mondi..."
},
"app.instance.worlds.this-server": {
"message": "questo server"
"app.instance.mods.updating": {
"message": "Aggiornando..."
},
"app.modal.install-to-play.content-required": {
"message": "Contenuto richiesto"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Opzioni d'istanza predefinite"
},
"app.settings.tabs.feature-flags": {
"message": "Flag di funzionalità"
},
"app.settings.tabs.java-installations": {
"message": "Installazioni Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Ricarica per installare l'aggiornamento"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Seleziona un'opzione"
},
"app.world.world-item.incompatible-version": {
"message": "Versione {version} incompatibile"
},
"app.world.world-item.not-played-yet": {
"message": "Mai avviato"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Stringi un'amicizia"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Modifica mondo"
},
"instance.files.adding-files": {
"message": "Aggiungendo i file ({completed}/{total})..."
},
"instance.files.save-as": {
"message": "Salva come..."
},
"instance.server-modal.address": {
"message": "Indirizzo"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Non mostrare nella home"
},
"instance.worlds.filter.available": {
"message": "Disponibile"
},
"instance.worlds.game_already_open": {
"message": "Istanza già aperta"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Avvia istanza"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Giocatore singolo"
},
"instance.worlds.view_instance": {
"message": "Mostra istanza"
},
+40 -109
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "認証サーバーにアクセスできません"
},
"app.browse.add-server-to-instance": {
"message": "サーバーをインスタンスに追加"
},
"app.browse.add-servers-to-instance": {
"message": "サーバーを自身のインスタンスに追加"
},
"app.browse.add-to-instance": {
"message": "インスタンスに追加"
},
"app.browse.add-to-instance-name": {
"message": "{instanceName} に追加"
},
"app.browse.added": {
"message": "追加済み"
},
"app.browse.already-added": {
"message": "すでに追加済み"
},
"app.browse.discover-content": {
"message": "コンテンツを探す"
},
"app.browse.discover-servers": {
"message": "サーバーを探す"
},
"app.browse.hide-added-servers": {
"message": "追加済みのサーバーを隠す"
},
"app.browse.hide-installed-content": {
"message": "インストール済みのコンテンツを隠す"
},
"app.browse.install-content-to-instance": {
"message": "コンテンツをインスタンスにインストールする"
},
"app.export-modal.description-placeholder": {
"message": "Modパックの説明を入力…"
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "インスタンスを削除"
},
"app.instance.modpack-already-installed.body": {
"message": "このModpackは既に <bold>{instanceName}</bold> インスタンスにインストール済みです。本当に複製しますか?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "このModパックは「{instanceName}インスタンスにすでにインストールされています。"
},
"app.instance.modpack-already-installed.create": {
"message": "新規作成"
"app.instance.modpack-already-installed.admonition-header": {
"message": "重複したModパック"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "とにかく作成する"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "インスタンスに移動"
},
"app.instance.modpack-already-installed.header": {
"message": "Modパックはすでにインストール済み"
},
"app.instance.modpack-already-installed.instance": {
"message": "インスタンス"
},
"app.instance.mods.content-type-project": {
"message": "プロジェクト"
},
"app.instance.mods.copy-link": {
"message": "リンクをコピー"
},
"app.instance.mods.installing": {
"message": "インストール中…"
},
"app.instance.mods.modpack-fallback": {
"message": "Modパック"
},
"app.instance.mods.project-was-added": {
"message": "「{name}」が追加されました"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Modパックのコンテンツを共有"
},
"app.instance.mods.show-file": {
"message": "ファイルを表示"
},
"app.instance.mods.successfully-uploaded": {
"message": "アップロードに成功しました"
},
"app.instance.worlds.add-server": {
"message": "サーバーを追加"
"app.instance.mods.unknown-version": {
"message": "不明"
},
"app.instance.worlds.browse-servers": {
"message": "サーバーを探す"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' は **完全に削除**され、元に戻すことはできません。"
},
"app.instance.worlds.delete-world-title": {
"message": "本当にこのワールドを完全に削除しますか?"
},
"app.instance.worlds.filter-modded": {
"message": "Mod導入済み"
},
"app.instance.worlds.filter-offline": {
"message": "オフライン"
},
"app.instance.worlds.filter-online": {
"message": "オンライン"
},
"app.instance.worlds.filter-vanilla": {
"message": "バニラ(Mod非導入)"
},
"app.instance.worlds.no-worlds-description": {
"message": "サーバーを追加、またはブラウズして始める"
},
"app.instance.worlds.no-worlds-heading": {
"message": "サーバー、ワールドは追加されていません"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' はゲーム内を含むサーバーリストから削除され、元に戻すことはできません。"
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) はゲーム内を含むサーバーリストから削除され、元に戻すことはできません。"
},
"app.instance.worlds.remove-server-title": {
"message": "本当に {name} を削除しますか?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "{count} 個のワールドを検索..."
},
"app.instance.worlds.this-server": {
"message": "このサーバー"
"app.instance.mods.updating": {
"message": "アップデート中…"
},
"app.modal.install-to-play.content-required": {
"message": "必須コンテンツ"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "インスタンスの基本設定"
},
"app.settings.tabs.feature-flags": {
"message": "機能設定"
},
"app.settings.tabs.java-installations": {
"message": "Javaのインストール設定"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "再起動して今すぐ更新"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "オプションを選択"
},
"app.world.world-item.incompatible-version": {
"message": "互換性の無いバージョン {version}"
},
"app.world.world-item.not-played-yet": {
"message": "未プレイ"
},
"app.world.world-item.offline": {
"message": "オフライン"
},
"app.world.world-item.players-online": {
"message": "{count} 人がオンライン"
},
"friends.action.add-friend": {
"message": "フレンドを追加"
},
@@ -282,10 +210,10 @@
"message": "フレンドを追加中"
},
"friends.add-friend.username.description": {
"message": "これはMinecraftユーザー名とは異なる可能性があります!"
"message": "これはMinecraftユーザーネームと違う可能性があります!"
},
"friends.add-friend.username.placeholder": {
"message": "Modrinthユーザー名を入力…"
"message": "Modrinthユーザーネームを入力..."
},
"friends.add-friend.username.title": {
"message": "あなたのフレンドのModrinthユーザー名は何ですか?"
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "ワールドを編集"
},
"instance.files.adding-files": {
"message": "ファイルを追加中 ({completed}/{total})"
},
"instance.files.save-as": {
"message": "名前をつけて保存..."
},
"instance.server-modal.address": {
"message": "アドレス"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "ホームに表示しない"
},
"instance.worlds.filter.available": {
"message": "利用可能"
},
"instance.worlds.game_already_open": {
"message": "インスタンスは既に開いています"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "インスタンスを起動"
},
"instance.worlds.type.server": {
"message": "サーバー"
},
"instance.worlds.type.singleplayer": {
"message": "シングルプレイ"
},
"instance.worlds.view_instance": {
"message": "インスタンスを表示する"
},
+18 -171
View File
@@ -5,149 +5,8 @@
"app.auth-servers.unreachable.header": {
"message": "인증 서버에 연결할 수 없습니다"
},
"app.browse.add-server-to-instance": {
"message": "인스턴스에 서버 추가"
},
"app.browse.add-servers-to-instance": {
"message": "인스턴스에 서버 추가"
},
"app.browse.add-to-instance": {
"message": "인스턴스에 추가"
},
"app.browse.add-to-instance-name": {
"message": "{instanceName}에 추가"
},
"app.browse.added": {
"message": "추가됨"
},
"app.browse.already-added": {
"message": "이미 추가됨"
},
"app.browse.discover-content": {
"message": "콘텐츠 탐색하기"
},
"app.browse.discover-servers": {
"message": "서버 탐색하기"
},
"app.browse.hide-added-servers": {
"message": "추가된 서버 숨기기"
},
"app.browse.hide-installed-content": {
"message": "설치된 콘텐츠 숨기기"
},
"app.browse.install-content-to-instance": {
"message": "인스턴스에 콘텐츠 설치"
},
"app.export-modal.description-placeholder": {
"message": "모드팩 설명 입력..."
},
"app.export-modal.export-button": {
"message": "내보내기"
},
"app.export-modal.header": {
"message": "모드팩 내보내기"
},
"app.export-modal.modpack-name-label": {
"message": "모드팩 이름"
},
"app.export-modal.modpack-name-placeholder": {
"message": "모드팩 이름"
},
"app.export-modal.select-files-label": {
"message": "팩에 포함할 파일과 폴더 선택"
},
"app.export-modal.version-number-label": {
"message": "버전 구분"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "인스턴스의 모든 데이터가 삭제됩니다. 세계 폴더, 설정 폴더 등 설치된 모든 컨텐츠가 포함됩니다."
},
"app.instance.confirm-delete.admonition-header": {
"message": "이 작업은 되돌릴 수 없습니다"
},
"app.instance.confirm-delete.delete-button": {
"message": "인스턴스 삭제"
},
"app.instance.confirm-delete.header": {
"message": "인스턴스 삭제"
},
"app.instance.modpack-already-installed.body": {
"message": "이 모드팩은 이미 <bold>{instanceName}</bold> 인스턴스에 설치되어 있습니다. 정말로 복제하시겠습니까?"
},
"app.instance.modpack-already-installed.create": {
"message": "생성"
},
"app.instance.modpack-already-installed.header": {
"message": "모드팩 이미 설치됨"
},
"app.instance.modpack-already-installed.instance": {
"message": "인스턴스"
},
"app.instance.mods.content-type-project": {
"message": "프로젝트"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" 추가됨"
},
"app.instance.mods.projects-were-added": {
"message": "프로젝트 {count}개 추가됨"
},
"app.instance.mods.share-text": {
"message": "제 모드팩에 사용중인 프로젝트를 확인해 보세요!"
},
"app.instance.mods.share-title": {
"message": "모드팩 콘텐츠 공유"
},
"app.instance.mods.successfully-uploaded": {
"message": "업로드 성공"
},
"app.instance.worlds.add-server": {
"message": "서버 추가"
},
"app.instance.worlds.browse-servers": {
"message": "서버 탐색하기"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}'이(가) **영구적으로 삭제**되며, 복구할 수 없습니다."
},
"app.instance.worlds.delete-world-title": {
"message": "정말로 이 세계를 영구적으로 삭제하시겠습니까?"
},
"app.instance.worlds.filter-modded": {
"message": "수정됨"
},
"app.instance.worlds.filter-offline": {
"message": "오프라인"
},
"app.instance.worlds.filter-online": {
"message": "온라인"
},
"app.instance.worlds.filter-vanilla": {
"message": "바닐라"
},
"app.instance.worlds.no-worlds-description": {
"message": "서버를 추가하거나 탐색하여 시작"
},
"app.instance.worlds.no-worlds-heading": {
"message": "추가된 서버 또는 세계 없음"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}'이(가) 게임 내를 포함한 모든 목록에서 삭제되며, 복구할 수 없습니다."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address})이(가) 게임 내를 포함한 모든 목록에서 삭제되며, 복구할 수 없습니다."
},
"app.instance.worlds.remove-server-title": {
"message": "정말로 {name}을(를) 제거하시겠습니까?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "{count}개의 세계 검색..."
},
"app.instance.worlds.this-server": {
"message": "이 서버"
"app.instance.mods.updating": {
"message": "업데이트 중..."
},
"app.modal.install-to-play.content-required": {
"message": "콘텐츠 설치 필요"
@@ -197,6 +56,9 @@
"app.settings.tabs.default-instance-options": {
"message": "기본 인스턴스 옵션"
},
"app.settings.tabs.feature-flags": {
"message": "기능 플래그"
},
"app.settings.tabs.java-installations": {
"message": "Java 설치"
},
@@ -216,7 +78,7 @@
"message": "Modrinth App v{version} 다운로드가 완료되었습니다. 새로고침하거나 Modrinth App을 종료하면 자동으로 업데이트됩니다."
},
"app.update-popup.body.linux": {
"message": "Modrinth App v{version}을 사용할 수 있습니다. 최신 기능과 오류 수정을 적용하려면 패키지 관리자를 통해 업데이트하세요!"
"message": "Modrinth App v{version} 버전을 사용할 수 있습니다. 최신 기능과 오류 수정을 적용하려면 패키지 관리자를 통해 업데이트하세요!"
},
"app.update-popup.body.metered": {
"message": "Modrinth App v{version}을 지금 사용할 수 있습니다! 데이터 통신 연결을 사용 중이므로, 자동으로 다운로드하지 않았습니다."
@@ -225,7 +87,7 @@
"message": "변경 내역"
},
"app.update-popup.download": {
"message": "다운로드 ({size})"
"message": "({size}) 다운로드"
},
"app.update-popup.download-complete": {
"message": "다운로드 완료"
@@ -251,24 +113,6 @@
"app.update.reload-to-update": {
"message": "새로고침하여 업데이트 설치"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "옵션 선택"
},
"app.world.world-item.incompatible-version": {
"message": "{version} 버전에 호환되지 않음"
},
"app.world.world-item.not-played-yet": {
"message": "플레이 안 함"
},
"app.world.world-item.offline": {
"message": "오프라인"
},
"app.world.world-item.players-online": {
"message": "{count}명 온라인"
},
"friends.action.add-friend": {
"message": "친구 추가"
},
@@ -321,7 +165,7 @@
"message": "대기 중"
},
"friends.no-friends-match": {
"message": "\"{query}\"과(와) 일치하는 친구 없음"
"message": "\"{query}\" 이름과 일치하는 친구 없음"
},
"friends.search-friends-placeholder": {
"message": "친구 검색 중..."
@@ -368,12 +212,6 @@
"instance.edit-world.title": {
"message": "세계 편집"
},
"instance.files.adding-files": {
"message": "파일 추가 중 ({completed}/{total})"
},
"instance.files.save-as": {
"message": "다른 이름으로 저장..."
},
"instance.server-modal.address": {
"message": "주소"
},
@@ -420,7 +258,7 @@
"message": "아이콘 제거"
},
"instance.settings.tabs.general.edit-icon.replace": {
"message": "아이콘 체"
"message": "아이콘 체"
},
"instance.settings.tabs.general.edit-icon.select": {
"message": "아이콘 선택"
@@ -545,6 +383,9 @@
"instance.worlds.dont_show_on_home": {
"message": "홈에서 숨기기"
},
"instance.worlds.filter.available": {
"message": "이용 가능"
},
"instance.worlds.game_already_open": {
"message": "이미 실행된 인스턴스"
},
@@ -569,6 +410,12 @@
"instance.worlds.play_instance": {
"message": "인스턴스 플레이"
},
"instance.worlds.type.server": {
"message": "서버"
},
"instance.worlds.type.singleplayer": {
"message": "싱글 플레이"
},
"instance.worlds.view_instance": {
"message": "인스턴스 보기"
},
+32 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Tidak dapat mencapai pelayan pengesahan"
},
"app.browse.add-server-to-instance": {
"message": "Tambahkan pelayan ke dalam pemasangan"
},
"app.browse.add-servers-to-instance": {
"message": "Tambahkan pelayan ke dalam pemasangan anda"
},
"app.browse.add-to-instance": {
"message": "Tambahkan ke dalam pemasangan"
},
"app.browse.add-to-instance-name": {
"message": "Tambahkan ke {instanceName}"
},
"app.browse.added": {
"message": "Ditambah"
},
"app.browse.already-added": {
"message": "Sudah ditambah"
},
"app.browse.discover-content": {
"message": "Temui kandungan"
},
"app.browse.discover-servers": {
"message": "Temui pelayan"
},
"app.browse.hide-added-servers": {
"message": "Sembunyikan pelayan yang ditambah"
},
"app.browse.hide-installed-content": {
"message": "Sembunyikan kandungan yang dipasang"
},
"app.browse.install-content-to-instance": {
"message": "Pasang kandungan ke dalam pemasangan"
},
"app.export-modal.description-placeholder": {
"message": "Masukkan keterangan pek mod..."
},
@@ -74,21 +41,27 @@
"app.instance.confirm-delete.header": {
"message": "Padam pemasangan"
},
"app.instance.modpack-already-installed.body": {
"message": "Pek mod ini telah dipasang dalam pemasangan <bold>{instanceName}</bold>. Adakah anda pasti mahu menduakannya?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Pek mod ini sudah pun dipasang di dalam pemasangan \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Cipta"
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Pergi ke pemasangan"
},
"app.instance.modpack-already-installed.header": {
"message": "Pek mod sudah dipasang"
},
"app.instance.modpack-already-installed.instance": {
"message": "Pemasangan"
},
"app.instance.mods.content-type-project": {
"message": "projek"
},
"app.instance.mods.copy-link": {
"message": "Salin pautan"
},
"app.instance.mods.installing": {
"message": "Sedang memasang..."
},
"app.instance.mods.modpack-fallback": {
"message": "Pek Mod"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" telah ditambahkan"
},
@@ -101,53 +74,17 @@
"app.instance.mods.share-title": {
"message": "Berkongsi kandungan pek mod"
},
"app.instance.mods.show-file": {
"message": "Tunjukkan fail"
},
"app.instance.mods.successfully-uploaded": {
"message": "Berjaya dimuat naik"
},
"app.instance.worlds.add-server": {
"message": "Tambah pelayan"
"app.instance.mods.unknown-version": {
"message": "Tidak Diketahui"
},
"app.instance.worlds.browse-servers": {
"message": "Layari pelayan"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' akan **dipadamkan secara kekal**, dan tiada cara untuk memulihkannya."
},
"app.instance.worlds.delete-world-title": {
"message": "Adakah anda pasti mahu memadamkan dunia ini secara kekal?"
},
"app.instance.worlds.filter-modded": {
"message": "Diubah Suai"
},
"app.instance.worlds.filter-offline": {
"message": "Luar Talian"
},
"app.instance.worlds.filter-online": {
"message": "Dalam Talian"
},
"app.instance.worlds.filter-vanilla": {
"message": "Vanila"
},
"app.instance.worlds.no-worlds-description": {
"message": "Tambah sebuah pelayan atau layari untuk bermula"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Tiada pelayan atau dunia ditambah"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' akan dialih keluar daripada senarai anda, termasuk dalam permainan, dan tiada cara untuk memulihkannya."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) akan dialih keluar daripada senarai anda, termasuk dalam permainan, dan tiada cara untuk memulihkannya."
},
"app.instance.worlds.remove-server-title": {
"message": "Adakah anda pasti mahu mengalih keluar {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Cari {count} dunia..."
},
"app.instance.worlds.this-server": {
"message": "pelayan ini"
"app.instance.mods.updating": {
"message": "Sedang mengemas kini..."
},
"app.modal.install-to-play.content-required": {
"message": "Kandungan yang diperlukan"
@@ -197,6 +134,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Tetapan lalai pemasangan"
},
"app.settings.tabs.feature-flags": {
"message": "Penetapan ciri"
},
"app.settings.tabs.java-installations": {
"message": "Pemasangan Java"
},
@@ -251,24 +191,6 @@
"app.update.reload-to-update": {
"message": "Muat semula untuk memasang kemas kini"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Pilih pilihan anda"
},
"app.world.world-item.incompatible-version": {
"message": "Versi tidak serasi: {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Belum dimainkan"
},
"app.world.world-item.offline": {
"message": "Luar Talian"
},
"app.world.world-item.players-online": {
"message": "{count} dalam talian"
},
"friends.action.add-friend": {
"message": "Tambah rakan"
},
@@ -368,12 +290,6 @@
"instance.edit-world.title": {
"message": "Sunting dunia"
},
"instance.files.adding-files": {
"message": "Sedang menambah fail ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Simpan sebagai..."
},
"instance.server-modal.address": {
"message": "Alamat"
},
@@ -545,6 +461,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Jangan tunjukkan pada Laman Utama"
},
"instance.worlds.filter.available": {
"message": "Tersedia"
},
"instance.worlds.game_already_open": {
"message": "Pemasangan sudah pun dibuka"
},
@@ -569,6 +488,12 @@
"instance.worlds.play_instance": {
"message": "Mainkan pemasangan"
},
"instance.worlds.type.server": {
"message": "Pelayan"
},
"instance.worlds.type.singleplayer": {
"message": "Ekapemain"
},
"instance.worlds.view_instance": {
"message": "Lihat pemasangan"
},
@@ -41,12 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Verwijder instantie"
},
"app.instance.modpack-already-installed.admonition-body": {
"message": "Deze modpack is al geïnstalleerd in de \"{instanceName}\" instantie."
},
"app.instance.modpack-already-installed.admonition-header": {
"message": "Dupliceer modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Maak toch"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ga naar instantie"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack is al geïnstalleerd"
},
"app.instance.mods.content-type-project": {
"message": "project"
},
"app.instance.mods.copy-link": {
"message": "Kopieer link"
},
"app.instance.mods.installing": {
"message": "Aan het installeren..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" was toegevoegd"
},
@@ -59,9 +80,18 @@
"app.instance.mods.share-title": {
"message": "Modpack-inhoud delen"
},
"app.instance.mods.show-file": {
"message": "Bestand weergeven"
},
"app.instance.mods.successfully-uploaded": {
"message": "Succesvol geüpload"
},
"app.instance.mods.unknown-version": {
"message": "Onbekend"
},
"app.instance.mods.updating": {
"message": "Aan het updaten..."
},
"app.modal.install-to-play.content-required": {
"message": "Content vereist"
},
@@ -110,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Standaardopties voor instantie"
},
"app.settings.tabs.feature-flags": {
"message": "Feature flags"
},
"app.settings.tabs.java-installations": {
"message": "Java installaties"
},
@@ -434,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Niet tonen op de startpagina"
},
"instance.worlds.filter.available": {
"message": "Beschikbaar"
},
"instance.worlds.game_already_open": {
"message": "Instantie is al open"
},
@@ -458,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Speel instantie"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Alleen spelen"
},
"instance.worlds.view_instance": {
"message": "Bekijk instantie"
},
@@ -41,6 +41,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Standard instansinstillinger"
},
"app.settings.tabs.feature-flags": {
"message": "Funksjonsflagg"
},
"app.settings.tabs.java-installations": {
"message": "Java installasjoner"
},
@@ -338,6 +341,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Ikke vis på Hjem"
},
"instance.worlds.filter.available": {
"message": "Tilgjengelig"
},
"instance.worlds.game_already_open": {
"message": "Instansen er allerede open"
},
@@ -359,6 +365,12 @@
"instance.worlds.play_instance": {
"message": "Spill instans"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Enkeltspillermodus"
},
"instance.worlds.view_instance": {
"message": "Vis instans"
},
+33 -117
View File
@@ -5,42 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Nie udało się połączyć się z serwerami uwierzytelniania"
},
"app.browse.add-server-to-instance": {
"message": "Dodaj serwer do instancji"
},
"app.browse.add-servers-to-instance": {
"message": "Dodaj serwery do swojej instancji"
},
"app.browse.add-to-instance": {
"message": "Dodaj do instancji"
},
"app.browse.add-to-instance-name": {
"message": "Dodaj do {instanceName}"
},
"app.browse.added": {
"message": "Dodano"
},
"app.browse.already-added": {
"message": "Już dodano"
},
"app.browse.discover-content": {
"message": "Odkrywaj zawartość"
},
"app.browse.discover-servers": {
"message": "Odkryj serwery"
},
"app.browse.hide-added-servers": {
"message": "Ukryj dodane serwery"
},
"app.browse.hide-installed-content": {
"message": "Ukryj zainstalowane zasoby"
},
"app.browse.install-content-to-instance": {
"message": "Zainstaluj zasoby do instancji"
},
"app.export-modal.description-placeholder": {
"message": "Wprowadź opis paczki modów..."
},
"app.export-modal.export-button": {
"message": "Eksportuj"
},
@@ -74,81 +38,45 @@
"app.instance.confirm-delete.header": {
"message": "Usuń instancję"
},
"app.instance.modpack-already-installed.body": {
"message": "Ta paczka modów jest już zainstalowana w instancji <bold>{instanceName}</bold>. Czy na pewno chcesz utworzyć duplikat?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Ta paczka modów jest już zainstalowana w instancji \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Utwórz"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Duplikat paczki modów"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Utwórz mimo to"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Przejdź do instancji"
},
"app.instance.modpack-already-installed.header": {
"message": "Paczka modów jest już zainstalowana"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instalacja"
},
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Kopiuj łącze"
},
"app.instance.mods.installing": {
"message": "Instalowanie..."
},
"app.instance.mods.modpack-fallback": {
"message": "Paczka modów"
},
"app.instance.mods.project-was-added": {
"message": "Dodano \"{name}\""
},
"app.instance.mods.projects-were-added": {
"message": "Dodano {count} {count, plural, one {projekt} few {projekty} other {projektów}}"
},
"app.instance.mods.share-text": {
"message": "Sprawdź projekty, które używam w mojej paczce modów!"
},
"app.instance.mods.share-title": {
"message": "Udostępnianie zawartości paczki modów"
"app.instance.mods.show-file": {
"message": "Pokaż plik"
},
"app.instance.mods.successfully-uploaded": {
"message": "Przesyłanie powiodło się"
},
"app.instance.worlds.add-server": {
"message": "Dodaj serwer"
},
"app.instance.worlds.browse-servers": {
"message": "Szukaj serwerów"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' zostanie **permanentnie usunięty**, i nie ma możliwości go odzyskać."
},
"app.instance.worlds.delete-world-title": {
"message": "Czy na pewno chcesz trwale usunąć ten świat?"
},
"app.instance.worlds.filter-modded": {
"message": "Zmodowany"
},
"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": "Dodaj serwer lub szukaj, aby rozpocząć"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Nie dodano żadnych światów ani serwerów"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' zostanie usunięty z twojej listy, również z gry, i nie będzie możliwości go odzyskać."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) zostanie usunięty z twojej listy, również z gry, i nie będzie możliwości go odzyskać."
},
"app.instance.worlds.remove-server-title": {
"message": "Czy jesteś pewny, że chcesz usunąć {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Szukaj wśród {count} światów..."
},
"app.instance.worlds.this-server": {
"message": "ten serwer"
},
"app.modal.install-to-play.content-required": {
"message": "Wymagane treści"
},
@@ -197,6 +125,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Domyślne opcje instancji"
},
"app.settings.tabs.feature-flags": {
"message": "Flagi funkcji"
},
"app.settings.tabs.java-installations": {
"message": "Instalacje Java"
},
@@ -251,24 +182,6 @@
"app.update.reload-to-update": {
"message": "Załaduj ponownie, aby zainstalować aktualizację"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Wybierz opcję"
},
"app.world.world-item.incompatible-version": {
"message": "Niekompatybilna wersja {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Jeszcze nie grano"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Dodaj znajomego"
},
@@ -368,12 +281,6 @@
"instance.edit-world.title": {
"message": "Edytuj świat"
},
"instance.files.adding-files": {
"message": "Dodawanie plików ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Zapisz jako..."
},
"instance.server-modal.address": {
"message": "Adres"
},
@@ -545,6 +452,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Nie pokazuj na stronie głównej"
},
"instance.worlds.filter.available": {
"message": "Dostępny"
},
"instance.worlds.game_already_open": {
"message": "Instancja jest już otwarta"
},
@@ -569,6 +479,12 @@
"instance.worlds.play_instance": {
"message": "Zagraj"
},
"instance.worlds.type.server": {
"message": "Serwer"
},
"instance.worlds.type.singleplayer": {
"message": "Tryb jednoosobowy"
},
"instance.worlds.view_instance": {
"message": "Zobacz instancję"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Não foi possível acessar os servidores de autenticação"
},
"app.browse.add-server-to-instance": {
"message": "Adicionar servidor à instância"
},
"app.browse.add-servers-to-instance": {
"message": "Adicionar servidores à sua instância"
},
"app.browse.add-to-instance": {
"message": "Adicionar à instância"
},
"app.browse.add-to-instance-name": {
"message": "Adicionar a {instanceName}"
},
"app.browse.added": {
"message": "Adicionado"
},
"app.browse.already-added": {
"message": "Já adicionado"
},
"app.browse.discover-content": {
"message": "Descubra conteúdo"
},
"app.browse.discover-servers": {
"message": "Descubra servidores"
},
"app.browse.hide-added-servers": {
"message": "Ocultar servidores adicionados"
},
"app.browse.hide-installed-content": {
"message": "Ocultar conteúdo instalado"
},
"app.browse.install-content-to-instance": {
"message": "Instalar conteúdo na instância"
},
"app.export-modal.description-placeholder": {
"message": "Insira a descrição do pacote de mods..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Excluir instância"
},
"app.instance.modpack-already-installed.body": {
"message": "Este pacote de mods já está instalado na instância <bold>{instanceName}</bold>. Tem certeza de que deseja duplicá-lo?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Este pacote de mods já está instalado na instância \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Criar"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Pacote de mods duplicado"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Criar mesmo assim"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Ir para a instância"
},
"app.instance.modpack-already-installed.header": {
"message": "O pacote de mods já está instalado"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instância"
},
"app.instance.mods.content-type-project": {
"message": "projeto"
},
"app.instance.mods.copy-link": {
"message": "Copiar link"
},
"app.instance.mods.installing": {
"message": "Instalando..."
},
"app.instance.mods.modpack-fallback": {
"message": "Pacote de mods"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" foi adicionado"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Compartilhando conteúdo do pacote de mods\n\n\n \t\t\t\t\t\t\n \t\t\t\t\t\t\t\n \t\t\t\t\t\t\n \t\t\t\t\t\t"
},
"app.instance.mods.show-file": {
"message": "Mostrar arquivo"
},
"app.instance.mods.successfully-uploaded": {
"message": "Enviado com sucesso"
},
"app.instance.worlds.add-server": {
"message": "Adicionar servidor"
"app.instance.mods.unknown-version": {
"message": "Desconhecido"
},
"app.instance.worlds.browse-servers": {
"message": "Explorar servidores"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' será excluído permanentemente, e não haverá como recuperá-lo."
},
"app.instance.worlds.delete-world-title": {
"message": "Tem certeza de que deseja excluir este mundo permanentemente?"
},
"app.instance.worlds.filter-modded": {
"message": "Modificado"
},
"app.instance.worlds.filter-offline": {
"message": "Offline"
},
"app.instance.worlds.filter-online": {
"message": "Online"
},
"app.instance.worlds.filter-vanilla": {
"message": "Jogo padrão"
},
"app.instance.worlds.no-worlds-description": {
"message": "Adicione um servidor ou explore para começar"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Nenhum servidor ou mundo adicionado"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' será removido da sua lista, inclusive no jogo, e não haverá como recuperá-lo."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) será removido da sua lista, inclusive no jogo, e não haverá como recuperá-lo."
},
"app.instance.worlds.remove-server-title": {
"message": "Tem certeza de que deseja remover {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Buscar {count} mundos..."
},
"app.instance.worlds.this-server": {
"message": "este servidor"
"app.instance.mods.updating": {
"message": "Atualizando..."
},
"app.modal.install-to-play.content-required": {
"message": "Conteúdo necessário"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Opções da instância"
},
"app.settings.tabs.feature-flags": {
"message": "Sinalização de recursos"
},
"app.settings.tabs.java-installations": {
"message": "Instalações do Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Recarregue para instalar a atualização"
},
"app.world.server-modal.placeholder-address": {
"message": "exemplo.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Selecione uma opção"
},
"app.world.world-item.incompatible-version": {
"message": "Versão incompatível {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Ainda não jogado"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Adicionar um amigo"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.files.adding-files": {
"message": "Adicionando arquivos ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Salvar como..."
},
"instance.server-modal.address": {
"message": "Endereço"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Não mostrar na tela inicial"
},
"instance.worlds.filter.available": {
"message": "Disponível"
},
"instance.worlds.game_already_open": {
"message": "A instância já está aberta"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Jogar na instância"
},
"instance.worlds.type.server": {
"message": "Servidor"
},
"instance.worlds.type.singleplayer": {
"message": "Um jogador"
},
"instance.worlds.view_instance": {
"message": "Ver instância"
},
+12 -222
View File
@@ -5,153 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Não foi possível alcançar os servidores de autenticação"
},
"app.browse.add-server-to-instance": {
"message": "Adicionar servidor à instância"
},
"app.browse.add-servers-to-instance": {
"message": "Adicionar servidores à tua instância"
},
"app.browse.add-to-instance": {
"message": "Adicionar à instância"
},
"app.browse.add-to-instance-name": {
"message": "Adicionar a {instanceName}"
},
"app.browse.added": {
"message": "Adicionado"
},
"app.browse.already-added": {
"message": "Já adicionado"
},
"app.browse.discover-content": {
"message": "Descobrir conteúdo"
},
"app.browse.discover-servers": {
"message": "Descobrir servidores"
},
"app.browse.hide-added-servers": {
"message": "Esconder servidores adicionados"
},
"app.browse.hide-installed-content": {
"message": "Esconder conteúdo instalado"
},
"app.browse.install-content-to-instance": {
"message": "Instalar conteúdo à instância"
},
"app.export-modal.description-placeholder": {
"message": "Insere a descrição do modpack..."
},
"app.export-modal.export-button": {
"message": "Exportar"
},
"app.export-modal.header": {
"message": "Exportar modpack"
},
"app.export-modal.modpack-name-label": {
"message": "Nome do Modpack"
},
"app.export-modal.modpack-name-placeholder": {
"message": "Nome do Modpack"
},
"app.export-modal.select-files-label": {
"message": "Seleciona as pastas e ficheiros a incluir no pack"
},
"app.export-modal.version-number-label": {
"message": "Número da versão"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Todos os dados da tua instância vão ser permanentemente apagados, incluídos os teus mundos, definições, e todos os conteúdos instalados."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Esta ação não pode ser desfeita"
},
"app.instance.confirm-delete.delete-button": {
"message": "Apagar instância"
},
"app.instance.confirm-delete.header": {
"message": "Apagar instância"
},
"app.instance.modpack-already-installed.body": {
"message": "Este modpack já está instalado na instância <bold>{instanceName}</bold>. Tens a certeza que o queres duplicar?"
},
"app.instance.modpack-already-installed.create": {
"message": "Criar"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack já instalado"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instância"
},
"app.instance.mods.content-type-project": {
"message": "projeto"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" foi adicionado"
},
"app.instance.mods.projects-were-added": {
"message": "{count} projetos foram adicionados"
},
"app.instance.mods.share-text": {
"message": "Vê os projetos que estou a usar no meu modpack!"
},
"app.instance.mods.share-title": {
"message": "Partilhar conteúdo do modpack"
},
"app.instance.mods.successfully-uploaded": {
"message": "Carregado com sucesso"
},
"app.instance.worlds.add-server": {
"message": "Adicionar servidor"
},
"app.instance.worlds.browse-servers": {
"message": "Procurar servidores"
},
"app.instance.worlds.delete-world-description": {
"message": "\"{name}\" vai ser **apagado permanentemente**, e não haverá maneira de o recuperar."
},
"app.instance.worlds.delete-world-title": {
"message": "Tens a certeza que queres apagar permanentemente este mundo?"
},
"app.instance.worlds.filter-modded": {
"message": "Com Mods"
},
"app.instance.worlds.filter-offline": {
"message": "Offline"
},
"app.instance.worlds.filter-online": {
"message": "Online"
},
"app.instance.worlds.filter-vanilla": {
"message": "Sem mods"
},
"app.instance.worlds.no-worlds-description": {
"message": "Adiciona um servidor ou procura um para começar"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Sem servidores ou mundos adicionados"
},
"app.instance.worlds.remove-server-description": {
"message": "\"{name}\" vai ser removido da tua lista, incluindo dentro do jogo, e não haverá maneira de o recuperar."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "\"{name}\" ({address}) vai ser removido da tua lista, incluindo dentro do jogo, e não haverá maneira de o recuperar."
},
"app.instance.worlds.remove-server-title": {
"message": "Tens a certeza que queres remover {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Pesquisar {count} mundos..."
},
"app.instance.worlds.this-server": {
"message": "este servidor"
},
"app.modal.install-to-play.content-required": {
"message": "Conteúdo necessário"
},
"app.modal.install-to-play.header": {
"message": "Instala para jogar"
},
@@ -161,21 +14,12 @@
"app.modal.install-to-play.mod-count": {
"message": "{count, plural, one {mod} other {mods}}"
},
"app.modal.install-to-play.required-modpack": {
"message": "Modpack requerido"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "Este servidor requer mods para jogares. Clica Instalar para transferir os ficheiros necessários do Modrinth, e então entrar diretamente no servidor."
},
"app.modal.install-to-play.shared-instance": {
"message": "Instância partilhada"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "Instância de servidor partilhada"
},
"app.modal.install-to-play.view-contents": {
"message": "Ver conteúdo"
},
"app.modal.update-to-play.header": {
"message": "Atualiza para jogar"
},
@@ -197,6 +41,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Opções padrão de instância"
},
"app.settings.tabs.feature-flags": {
"message": "Flags de funcionalidades"
},
"app.settings.tabs.java-installations": {
"message": "Instalações Java"
},
@@ -209,33 +56,6 @@
"app.settings.tabs.resource-management": {
"message": "Gestão de recursos"
},
"app.update-popup.body": {
"message": "Modrinth App v{version} está pronta para ser instalada! Recarrega para atualizar agora, ou automaticamente quando fechares a Modrinth App."
},
"app.update-popup.body.download-complete": {
"message": "Modrinth App v{version} acabou de ser transferida. Recarrega para atualizar agora, ou automaticamente quando fechares a Modrinth App."
},
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} está disponível. Usa o teu gestor de pacotes para atualizar e receber as correções e recursos mais recentes!"
},
"app.update-popup.body.metered": {
"message": "Modrinth App v{version} está disponível! Como estás numa rede com tráfego limitado, não a transferimos automaticamente."
},
"app.update-popup.changelog": {
"message": "Lista de alterações"
},
"app.update-popup.download": {
"message": "Transferir ({size})"
},
"app.update-popup.download-complete": {
"message": "Transferência concluída"
},
"app.update-popup.reload": {
"message": "Recarregar"
},
"app.update-popup.title": {
"message": "Atualização disponível"
},
"app.update.complete-toast.text": {
"message": "Clica aqui para ver a lista de alterações."
},
@@ -251,24 +71,6 @@
"app.update.reload-to-update": {
"message": "Recarrega para instalar a atualização"
},
"app.world.server-modal.placeholder-address": {
"message": "exemplo.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Seleciona uma opção"
},
"app.world.world-item.incompatible-version": {
"message": "Versão incompatível {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Ainda não jogado"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Adicionar um amigo"
},
@@ -368,12 +170,6 @@
"instance.edit-world.title": {
"message": "Editar mundo"
},
"instance.files.adding-files": {
"message": "Adicionando ficheiros ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Guardar como..."
},
"instance.server-modal.address": {
"message": "Endereço"
},
@@ -545,6 +341,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Não mostrar na página Inicial"
},
"instance.worlds.filter.available": {
"message": "Disponível"
},
"instance.worlds.game_already_open": {
"message": "Instância já está aberta"
},
@@ -554,9 +353,6 @@
"instance.worlds.incompatible_server": {
"message": "Servidor é incompatível"
},
"instance.worlds.linked_server": {
"message": "Gerido pelo projeto do servidor"
},
"instance.worlds.no_contact": {
"message": "Servidor não conseguiu ser contactado"
},
@@ -569,6 +365,12 @@
"instance.worlds.play_instance": {
"message": "Jogar instância"
},
"instance.worlds.type.server": {
"message": "Servidor"
},
"instance.worlds.type.singleplayer": {
"message": "Um jogador"
},
"instance.worlds.view_instance": {
"message": "Ver instância"
},
@@ -586,17 +388,5 @@
},
"search.filter.locked.instance.sync": {
"message": "Sincronizar com a instância"
},
"search.filter.locked.server": {
"message": "Fornecido pelo servidor"
},
"search.filter.locked.server-environment.title": {
"message": "Apenas mods no cliente podem ser adicionados à instância de servidor"
},
"search.filter.locked.server-game-version.title": {
"message": "Versão do jogo é fornecida pelo servidor"
},
"search.filter.locked.server-loader.title": {
"message": "Carregador é fornecido pelo servidor"
}
}
@@ -5,6 +5,9 @@
"app.auth-servers.unreachable.header": {
"message": "Nu se pot accesa serverele de autentificare"
},
"app.instance.mods.copy-link": {
"message": "Copiază linkul"
},
"app.modal.install-to-play.content-required": {
"message": "Conținut necesar"
},
@@ -53,6 +56,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Opțiuni implicite instanță"
},
"app.settings.tabs.feature-flags": {
"message": "Controale funcționalitate"
},
"app.settings.tabs.java-installations": {
"message": "Instalări Java"
},
@@ -377,6 +383,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Nu afișa în pagina principală"
},
"instance.worlds.filter.available": {
"message": "Disponibil"
},
"instance.worlds.game_already_open": {
"message": "Instanța este deja deschisă"
},
@@ -401,6 +410,12 @@
"instance.worlds.play_instance": {
"message": "Joacă pe instanța"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Un singur jucător"
},
"instance.worlds.view_instance": {
"message": "Afișează instanța"
},
+43 -112
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Нет связи с серверами аутентификации"
},
"app.browse.add-server-to-instance": {
"message": "Добавить сервер в сборку"
},
"app.browse.add-servers-to-instance": {
"message": "Добавление серверов в сборку"
},
"app.browse.add-to-instance": {
"message": "Добавить в сборку"
},
"app.browse.add-to-instance-name": {
"message": "Добавить в {instanceName}"
},
"app.browse.added": {
"message": "Добавлено"
},
"app.browse.already-added": {
"message": "Уже добавлено"
},
"app.browse.discover-content": {
"message": "Поиск проектов"
},
"app.browse.discover-servers": {
"message": "Поиск серверов"
},
"app.browse.hide-added-servers": {
"message": "Скрывать добавленные"
},
"app.browse.hide-installed-content": {
"message": "Скрывать установленные"
},
"app.browse.install-content-to-instance": {
"message": "Установить контент в сборку"
},
"app.export-modal.description-placeholder": {
"message": "Введите описание сборки..."
},
@@ -45,7 +12,7 @@
"message": "Экспортировать"
},
"app.export-modal.header": {
"message": "Экспорт сборки модов"
"message": "Экспорт модпака"
},
"app.export-modal.modpack-name-label": {
"message": "Название сборки"
@@ -54,7 +21,7 @@
"message": "Название сборки"
},
"app.export-modal.select-files-label": {
"message": "Выберите файлы или папки для включения в сборку"
"message": "Выберите элементы экспорта в модпак"
},
"app.export-modal.version-number-label": {
"message": "Номер версии"
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Удаление сборки"
},
"app.instance.modpack-already-installed.body": {
"message": "Эта сборка модов уже установлена в сборку <bold>{instanceName}</bold>. Вы уверены, что хотите дублировать её?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Этот модпак уже установлен в инстанции \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Создать"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Дублировать модпак"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Всё равно создать"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "К инстанции"
},
"app.instance.modpack-already-installed.header": {
"message": "Сборка модов уже установлена"
},
"app.instance.modpack-already-installed.instance": {
"message": "Сборка"
"message": "Модпак уже установлен"
},
"app.instance.mods.content-type-project": {
"message": "проект"
},
"app.instance.mods.copy-link": {
"message": "Копировать ссылку"
},
"app.instance.mods.installing": {
"message": "Установка..."
},
"app.instance.mods.modpack-fallback": {
"message": "Сборка"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" был добавлен"
},
@@ -96,58 +75,22 @@
"message": "Проектов добавлено: {count}"
},
"app.instance.mods.share-text": {
"message": "Посмотрите проекты, которые я использую в своей сборке модов!"
"message": "Посмотрите проекты, в моём модпаке!"
},
"app.instance.mods.share-title": {
"message": "Содержимое сборки"
},
"app.instance.mods.show-file": {
"message": "Показать в папке"
},
"app.instance.mods.successfully-uploaded": {
"message": "Успешно загружено"
},
"app.instance.worlds.add-server": {
"message": "Добавить сервер"
"app.instance.mods.unknown-version": {
"message": "Неизвестно"
},
"app.instance.worlds.browse-servers": {
"message": "Найти серверы"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' будет **удалён навсегда**, и будет невозможно восстановить."
},
"app.instance.worlds.delete-world-title": {
"message": "Вы уверены, что хотите удалить этот мир навсегда?"
},
"app.instance.worlds.filter-modded": {
"message": "Со сборкой"
},
"app.instance.worlds.filter-offline": {
"message": "Не в сети"
},
"app.instance.worlds.filter-online": {
"message": "В сети"
},
"app.instance.worlds.filter-vanilla": {
"message": "Не модифицировано"
},
"app.instance.worlds.no-worlds-description": {
"message": "Добавить сервер или найти, чтобы начать"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Сервера или мира не добавлены"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' будет удален из вашего списка, включая в игре, и восстановить будет невозможно."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) будет удален из вашего списка, включая в игре, и восстановить будет невозможно."
},
"app.instance.worlds.remove-server-title": {
"message": "Вы уверены, что хотите удалить {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Поиск по {count, plural, one {# миру} other {# мирам}}..."
},
"app.instance.worlds.this-server": {
"message": "Этот сервер"
"app.instance.mods.updating": {
"message": "Обновление..."
},
"app.modal.install-to-play.content-required": {
"message": "Требуется дополнительный контент"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Предустановки"
},
"app.settings.tabs.feature-flags": {
"message": "Флаги функций"
},
"app.settings.tabs.java-installations": {
"message": "Установки Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Перезапустить и обновить"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Выберите вариант"
},
"app.world.world-item.incompatible-version": {
"message": "Несовместимая версия {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Ещё не играли"
},
"app.world.world-item.offline": {
"message": "Не в сети"
},
"app.world.world-item.players-online": {
"message": "{count} в игре"
},
"friends.action.add-friend": {
"message": "Добавить в друзья"
},
@@ -330,7 +258,7 @@
"message": "{title} — {count}"
},
"friends.sign-in-to-add-friends": {
"message": "<link>Войдите в аккаунт Modrinth</link>, чтобы добавлять друзей и видеть, во что они играют!"
"message": "<link>Войдите в аккаунт Modrinth</link>, вы сможете добавлять друзей и видеть их статус!"
},
"instance.add-server.add-and-play": {
"message": "Добавить и играть"
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Настройка мира"
},
"instance.files.adding-files": {
"message": "Добавление файлов ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Сохранить как..."
},
"instance.server-modal.address": {
"message": "Адрес"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Не показывать на главной"
},
"instance.worlds.filter.available": {
"message": "Доступно"
},
"instance.worlds.game_already_open": {
"message": "Сборка уже запущена"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Запустить сборку"
},
"instance.worlds.type.server": {
"message": "Сервер"
},
"instance.worlds.type.singleplayer": {
"message": "Одиночная игра"
},
"instance.worlds.view_instance": {
"message": "Посмотреть сборку"
},
@@ -8,9 +8,24 @@
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.mods.copy-link": {
"message": "Kopiraj link"
},
"app.instance.mods.installing": {
"message": "Instaliranje..."
},
"app.instance.mods.show-file": {
"message": "Prikaži datoteku"
},
"app.instance.mods.successfully-uploaded": {
"message": "Uspešno otpremljeno"
},
"app.instance.mods.unknown-version": {
"message": "Nepoznato"
},
"app.instance.mods.updating": {
"message": "Ažuriranje..."
},
"app.settings.tabs.appearance": {
"message": "Izgled"
},
+30 -111
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Kan ej nå autentiseringsservrarna"
},
"app.browse.add-server-to-instance": {
"message": "Lägg till server till instans"
},
"app.browse.add-servers-to-instance": {
"message": "Lägg till servrar till din instans"
},
"app.browse.add-to-instance": {
"message": "Lägg till i instans"
},
"app.browse.add-to-instance-name": {
"message": "Lägg till i {instanceName}"
},
"app.browse.added": {
"message": "Tillagd"
},
"app.browse.already-added": {
"message": "Redan tillagd"
},
"app.browse.discover-content": {
"message": "Upptäck innehåll"
},
"app.browse.discover-servers": {
"message": "Upptäck servrar"
},
"app.browse.hide-added-servers": {
"message": "Dölj tillagda servrar"
},
"app.browse.hide-installed-content": {
"message": "Dölj installerat innehåll"
},
"app.browse.install-content-to-instance": {
"message": "Installera innehåll till instans"
},
"app.export-modal.description-placeholder": {
"message": "Ange modpaketets beskrivning..."
},
@@ -74,21 +41,21 @@
"app.instance.confirm-delete.header": {
"message": "Radera instans"
},
"app.instance.modpack-already-installed.body": {
"message": "Detta modpaket är redan installerat i instansen <bold>{instanceName}</bold>. Är du säker på att du vill duplicera det?"
},
"app.instance.modpack-already-installed.create": {
"message": "Skapa"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpaket redan installerat"
},
"app.instance.modpack-already-installed.instance": {
"message": "Instans"
"app.instance.modpack-already-installed.create-anyway": {
"message": "Skapa ändå"
},
"app.instance.mods.content-type-project": {
"message": "projekt"
},
"app.instance.mods.copy-link": {
"message": "Kopiera länk"
},
"app.instance.mods.installing": {
"message": "Installerar..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpaket"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" lades till"
},
@@ -101,53 +68,17 @@
"app.instance.mods.share-title": {
"message": "Delar innehåll från modpaket"
},
"app.instance.mods.show-file": {
"message": "Visa fil"
},
"app.instance.mods.successfully-uploaded": {
"message": "Uppladdning lyckades"
},
"app.instance.worlds.add-server": {
"message": "Lägg till server"
"app.instance.mods.unknown-version": {
"message": "Okänt"
},
"app.instance.worlds.browse-servers": {
"message": "Utforska servrar"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' kommer bli **permanent borttagen**, och det kommer inte finnas något sätt att återskapa den."
},
"app.instance.worlds.delete-world-title": {
"message": "Är du säker på att du vill permanent radera denna värld?"
},
"app.instance.worlds.filter-modded": {
"message": "Moddade"
},
"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": "Lägg till en server eller utforska för att komma igång"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Inga servrar eller världar tillagda"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' kommer bli borttagen från din lista, inklusive i spelet, och det kommer inte finnas något sätt att återskapa den."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) kommer bli borttagen från din lista, inklusive i spelet, och det kommer inte finnas något sätt att återskapa den."
},
"app.instance.worlds.remove-server-title": {
"message": "Är du säker på att du vill radera {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Sök {count} världar..."
},
"app.instance.worlds.this-server": {
"message": "denna server"
"app.instance.mods.updating": {
"message": "Uppdaterar..."
},
"app.modal.install-to-play.content-required": {
"message": "Innehåll krävs"
@@ -197,6 +128,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Standardinställningar för instanser"
},
"app.settings.tabs.feature-flags": {
"message": "Funktionsflaggor"
},
"app.settings.tabs.java-installations": {
"message": "Java-installationer"
},
@@ -251,24 +185,6 @@
"app.update.reload-to-update": {
"message": "Ladda om för att installera uppdatering"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Välj ett alternativ"
},
"app.world.world-item.incompatible-version": {
"message": "Inkompatibel version {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Inte spelad än"
},
"app.world.world-item.offline": {
"message": "Offline"
},
"app.world.world-item.players-online": {
"message": "{count} online"
},
"friends.action.add-friend": {
"message": "Lägg till en vän"
},
@@ -368,12 +284,6 @@
"instance.edit-world.title": {
"message": "Redigera värld"
},
"instance.files.adding-files": {
"message": "Lägger till filer ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Spara som..."
},
"instance.server-modal.address": {
"message": "Adress"
},
@@ -545,6 +455,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Visa inte på Startsidan"
},
"instance.worlds.filter.available": {
"message": "Tillgängliga"
},
"instance.worlds.game_already_open": {
"message": "Instans är redan öppen"
},
@@ -569,6 +482,12 @@
"instance.worlds.play_instance": {
"message": "Spela instans"
},
"instance.worlds.type.server": {
"message": "Server"
},
"instance.worlds.type.singleplayer": {
"message": "Enspelarläge"
},
"instance.worlds.view_instance": {
"message": "Visa instans"
},
+7 -262
View File
@@ -1,142 +1,34 @@
{
"app.auth-servers.unreachable.body": {
"message": "เซิร์ฟเวอร์ตรวจสอบสิทธิ์ของ Minecraft อาจใช้งานไม่ได้ในขณะนี้ โปรดตรวจสอบการเชื่อมต่ออินเทอร์เน็ตของคุณและลองใหม่อีกครั้งในภายหลัง"
},
"app.browse.add-server-to-instance": {
"message": "เพิ่มเซิร์ฟเวอร์ลงในอินสแตนซ์"
},
"app.browse.added": {
"message": "เพิ่ม"
},
"app.export-modal.description-placeholder": {
"message": "กรอกคำอธิบายมอดแพ็ก.."
},
"app.export-modal.modpack-name-label": {
"message": "ชื่อมอดแพ็ก"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "ข้อมูลทั้งหมดในอินสแตนซ์ของคุณจะถูกลบอย่างถาวร รวมถึงโลก การตั้งค่า และเนื้อหาที่ติดตั้งไว้ทั้งหมด"
},
"app.instance.confirm-delete.admonition-header": {
"message": "การดำเนินการนี้ไม่สามารถย้อนคืนได้"
},
"app.instance.confirm-delete.delete-button": {
"message": "ลบอินสแตนซ์"
},
"app.instance.modpack-already-installed.body": {
"message": "มอดแพ็กนี้ถูกติดตั้งไว้ในอินสแตนซ์ <bold>{instanceName}</bold> อยู่แล้ว คุณแน่ใจหรือไม่ว่าต้องการสร้างสำเนาซ้ำ?"
},
"app.instance.modpack-already-installed.create": {
"message": "สร้าง"
},
"app.instance.modpack-already-installed.header": {
"message": "ติดตั้งมอดแพ็กนี้อยู่แล้ว"
},
"app.instance.modpack-already-installed.instance": {
"message": "อินสแตนซ์"
},
"app.instance.mods.content-type-project": {
"message": "โปรเจกต์"
},
"app.instance.mods.project-was-added": {
"message": "เพิ่ม \"{name}\" เรียบร้อยแล้ว"
},
"app.instance.mods.projects-were-added": {
"message": "เพิ่ม {count} โปรเจกต์เรียบร้อยแล้ว"
},
"app.instance.mods.share-text": {
"message": "มาตรวจดูโปรเจกต์ต่าง ๆ ที่ฉันใช้ในมอดแพ็กนี้กัน!"
},
"app.instance.mods.successfully-uploaded": {
"message": "อัปโหลดสำเร็จ"
},
"app.instance.worlds.browse-servers": {
"message": "ค้นหาเซิฟเวอร์"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' จะถูกลบอย่างถาวร** และจะไม่สามารถกู้คืนได้**"
},
"app.instance.worlds.delete-world-title": {
"message": "คุณแน่ใจหรือไม่ว่าต้องการลบโลกนี้อย่างถาวร?"
},
"app.instance.worlds.filter-modded": {
"message": "แบบมีมอด"
},
"app.instance.worlds.filter-offline": {
"message": "ออฟไลน์"
},
"app.instance.worlds.filter-online": {
"message": "ออนไลน์"
},
"app.instance.worlds.filter-vanilla": {
"message": "ต้นฉบับ"
},
"app.instance.worlds.no-worlds-description": {
"message": "เพิ่มเซิร์ฟเวอร์หรือสำรวจเพื่อเริ่มต้น"
},
"app.instance.worlds.no-worlds-heading": {
"message": "ไม่มีเซิร์ฟเวอร์หรือโลกที่เพิ่มไว้"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' จะถูกลบออกจากรายชื่อของคุณ รวมถึงในเกมด้วย และจะไม่สามารถกู้คืนได้"
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) จะถูกลบออกจากรายชื่อของคุณ รวมถึงในเกมด้วย และจะไม่สามารถกู้คืนได้"
},
"app.instance.worlds.remove-server-title": {
"message": "คุณแน่ใจหรือไม่ว่าต้องการลบ {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "ค้นหา {count} โลก"
},
"app.instance.worlds.this-server": {
"message": "เซิร์ฟเวอร์อันนี้"
},
"app.modal.install-to-play.content-required": {
"message": "จำเป็นต้องมีเนื้อหา"
},
"app.modal.install-to-play.header": {
"message": "ติดตั้งเพื่อเล่น"
},
"app.modal.install-to-play.install-button": {
"message": "ติดตั้ง"
},
"app.modal.install-to-play.required-modpack": {
"message": "มอดแพ็กที่จำเป็น"
},
"app.modal.install-to-play.server-requires-mods": {
"message": "เซิร์ฟเวอร์นี้จำเป็นต้องใช้มอดเพื่อเข้าเล่น คลิกติดตั้ง เพื่อตั้งค่าไฟล์ที่จำเป็นจาก Modrinth จากนั้นจึงจะเข้าสู่เซิร์ฟเวอร์โดยตรงได้"
},
"app.modal.install-to-play.shared-instance": {
"message": "อินสแตนซ์ที่ใช้ร่วมกัน"
},
"app.modal.install-to-play.shared-server-instance": {
"message": "อินสแตนซ์เซิร์ฟเวอร์ที่ใช้ร่วมกัน"
},
"app.modal.update-to-play.header": {
"message": "อัปเดตเพื่อเล่น"
},
"app.modal.update-to-play.update-required": {
"message": "จำเป็นต้องอัปเดต"
"message": "ต้องมีการอัปเดต"
},
"app.modal.update-to-play.update-required-description": {
"message": "จำเป็นต้องอัปเดตเพื่อเล่น {name} กรุณาอัปเดตเป็นเวอร์ชันล่าสุดเพื่อเปิดเกม"
"message": "ต้องอัปเดตอย่างหนึ่งเพื่อเล่น {name}. โปรดอัปเดตให้เป็นเวอร์ชันล่าสุดเพื่อเปิดเกม"
},
"app.settings.developer-mode-enabled": {
"message": "โหมดนักพัฒนาเปิดอยู่"
"message": "กำลังอยู่ในโหมดผู้พัฒนา"
},
"app.settings.downloading": {
"message": "ดาวน์โหลด เวอร์ชั่น{version}"
},
"app.settings.tabs.appearance": {
"message": "หน้าตา"
"message": "รูปลักษณ์"
},
"app.settings.tabs.default-instance-options": {
"message": "ตัวเลือกอินสแตนซ์เริ่มต้น"
},
"app.settings.tabs.feature-flags": {
"message": "ระบบควบคุมการเปิดใช้งานฟีเจอร์"
},
"app.settings.tabs.java-installations": {
"message": "การจัดการ Java ที่ติดตั้ง"
},
@@ -149,15 +41,6 @@
"app.settings.tabs.resource-management": {
"message": "การจัดการทรัพยากร"
},
"app.update-popup.body.linux": {
"message": "Modrinth App v{version} พร้อมให้อัปเดตแล้ว โปรดใช้ตัวจัดการแพ็กเกจ ของคุณเพื่ออัปเดตฟีเจอร์ใหม่และตัวแก้ไขล่าสุด!"
},
"app.update-popup.download-complete": {
"message": "ดาวน์โหลดเสร็จสมบูรณ์"
},
"app.update-popup.title": {
"message": "มีการอัปเดตใหม่"
},
"app.update.complete-toast.text": {
"message": "คลิกที่นี่เพื่อดูบันทึกการเปลี่ยนแปลง"
},
@@ -173,18 +56,6 @@
"app.update.reload-to-update": {
"message": "รีโหลดเพื่อติดตั้งอัพเดต"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.world-item.incompatible-version": {
"message": "เวอร์ชัน {version} ไม่รองรับ"
},
"app.world.world-item.offline": {
"message": "ออฟไลน์"
},
"app.world.world-item.players-online": {
"message": "{count} ออนไลน์"
},
"friends.action.add-friend": {
"message": "เพิ่มเพื่อน"
},
@@ -230,9 +101,6 @@
"friends.heading.online": {
"message": "ออฟไลน์"
},
"friends.heading.pending": {
"message": "กําลังดำเนินการ"
},
"friends.no-friends-match": {
"message": "ไม่มีเพื่อนชื่อว่า \"{query}\""
},
@@ -281,12 +149,6 @@
"instance.edit-world.title": {
"message": "แก้ไขโลก"
},
"instance.files.adding-files": {
"message": "กำลังเพิ่มไฟล์ ({completed}/{total})"
},
"instance.files.save-as": {
"message": "บันทึกเป็น..."
},
"instance.server-modal.address": {
"message": "ที่อยู่เซิร์ฟเวอร์"
},
@@ -353,130 +215,13 @@
"instance.settings.tabs.general.name": {
"message": "ชื่อ"
},
"instance.settings.tabs.hooks": {
"message": "ตัวดักการปล่อย"
},
"instance.settings.tabs.hooks.custom-hooks": {
"message": "กำหนดเอง"
},
"instance.settings.tabs.hooks.description": {
"message": "ตัวดักจับช่วยให้ผู้ใช้ระดับสูงสามารถรันคำสั่งระบบบางอย่างได้ ทั้งก่อนและหลังการเปิดเกม"
},
"instance.settings.tabs.hooks.post-exit.enter": {
"message": "ป้อนคำสั่งหลังจบการทำงาน..."
},
"instance.settings.tabs.hooks.pre-launch": {
"message": "ก่อนรัน"
},
"instance.settings.tabs.hooks.title": {
"message": "ฮุกการเปิดเกม"
},
"instance.settings.tabs.hooks.wrapper": {
"message": "ตัวห่อหุ้ม"
},
"instance.settings.tabs.hooks.wrapper.description": {
"message": "คำสั่งตัวห่อหุ้มสำหรับเปิด ไมน์คราฟต์"
},
"instance.settings.tabs.hooks.wrapper.enter": {
"message": "ป้อนตัวห่อหุ้มคำสั่ง..."
},
"instance.settings.tabs.installation": {
"message": "การติดตั้ง"
},
"instance.settings.tabs.installation.loader-version": {
"message": "เวอร์ชั่น {loader}"
},
"instance.settings.tabs.java": {
"message": "Java และ หน่วยความจำ"
},
"instance.settings.tabs.java.hooks": {
"message": "ฮุก"
},
"instance.settings.tabs.java.java-arguments": {
"message": "อาร์กิวเมนต์ Java"
},
"instance.settings.tabs.java.java-installation": {
"message": "การติดตั้ง Java"
},
"instance.settings.tabs.java.java-memory": {
"message": "หน่วยความจำที่จัดสรร"
},
"instance.settings.tabs.window": {
"message": "หน้าต่าง"
},
"instance.settings.tabs.window.fullscreen": {
"message": "เต็มหน้าจอ"
},
"instance.settings.tabs.window.fullscreen.description": {
"message": "ทำให้เกมเปิดในโหมดเต็มหน้าจอเมื่อเริ่มเกม (โดยใช้ไฟล์ options.txt)"
},
"instance.settings.tabs.window.height": {
"message": "ความสูง"
},
"instance.settings.tabs.window.height.description": {
"message": "ความสูงของหน้าต่างเมื่อรันเกม"
},
"instance.settings.tabs.window.height.enter": {
"message": "ป้อนความสูง..."
},
"instance.settings.tabs.window.width": {
"message": "ความกว้าง"
},
"instance.settings.tabs.window.width.description": {
"message": "ความกว้างของหน้าต่างเมื่อรันเกม"
},
"instance.settings.tabs.window.width.enter": {
"message": "ป้อนความกว้าง..."
},
"instance.worlds.a_minecraft_server": {
"message": "เซิร์ฟเวอร์ ไมน์คราฟต์"
},
"instance.worlds.cant_connect": {
"message": "ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้"
},
"instance.worlds.copy_address": {
"message": "คัดลอกที่อยู่"
},
"instance.worlds.dont_show_on_home": {
"message": "ไม่ต้องแสดงในหน้าแรก"
},
"instance.worlds.game_already_open": {
"message": "อินสแตนซ์ถูกเปิดอยู่แล้ว"
},
"instance.worlds.hardcore": {
"message": "โหมดฮาร์ดคอร์"
},
"instance.worlds.incompatible_server": {
"message": "เซิร์ฟเวอร์ไม่รองรับ"
},
"instance.worlds.linked_server": {
"message": "จัดการโดยโปรเจกต์เซิร์ฟเวอร์"
},
"instance.worlds.no_contact": {
"message": "ไม่สามารถติดต่อเซิร์ฟเวอร์ได้"
},
"instance.worlds.no_server_quick_play": {
"message": "คุณสามารถเข้าสู่เซิร์ฟเวอร์ได้โดยตรงบน Minecraft Alpha 1.0.5 ขึ้นไปเท่านั้น"
},
"instance.worlds.no_singleplayer_quick_play": {
"message": "คุณสามารถเข้าสู่โลกผู้เล่นคนเดียวได้โดยตรงบน Minecraft 1.20 ขึ้นไปเท่านั้น"
},
"instance.worlds.play_instance": {
"message": "เริ่มเล่นอินสแตนซ์"
},
"instance.worlds.view_instance": {
"message": "ดูอินสแตนซ์"
},
"instance.worlds.world_in_use": {
"message": "โลกนี้กำลังถูกใช้งานอยู่"
},
"search.filter.locked.instance": {
"message": "อินสแตนซ์เป็นผู้จัดเตรียม"
},
"search.filter.locked.server": {
"message": "เซิร์ฟเวอร์เป็นผู้จัดเตรียม"
},
"search.filter.locked.server-game-version.title": {
"message": "เซิร์ฟเวอร์เป็นผู้จัดเตรียมเวอร์ชันเกม"
}
}
+29 -122
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Doğrulama sunucularına erişilemedi"
},
"app.browse.add-server-to-instance": {
"message": "Sunucuya içerik ekle"
},
"app.browse.add-servers-to-instance": {
"message": "İçeriğe sunucu ekle"
},
"app.browse.add-to-instance": {
"message": "İçerik ekle"
},
"app.browse.add-to-instance-name": {
"message": "{instanceName} içeriğine ekle"
},
"app.browse.added": {
"message": "Eklendi"
},
"app.browse.already-added": {
"message": "Zaten eklendi"
},
"app.browse.discover-content": {
"message": "İçerikleri keşfet"
},
"app.browse.discover-servers": {
"message": "Sunucuları keşfet"
},
"app.browse.hide-added-servers": {
"message": "Eklenen sunucuları gizle\n"
},
"app.browse.hide-installed-content": {
"message": "Yüklü İçerikleri Gizle"
},
"app.browse.install-content-to-instance": {
"message": "İçeriği profile yükle"
},
"app.export-modal.description-placeholder": {
"message": "Mod paketi açıklaması yazın..."
},
@@ -53,42 +20,33 @@
"app.export-modal.modpack-name-placeholder": {
"message": "Modpaketi adı"
},
"app.export-modal.select-files-label": {
"message": "Pakete dahil edilecek dosya ve klasörleri seçin"
},
"app.export-modal.version-number-label": {
"message": "Sürüm numarası"
},
"app.export-modal.version-number-placeholder": {
"message": "1.0.0"
},
"app.instance.confirm-delete.admonition-body": {
"message": "Dünyalarınız, yapılandırmalarınız ve yüklü tüm içerikler ve tüm veriler kalıcı olarak silinecek."
},
"app.instance.confirm-delete.admonition-header": {
"message": "Bu eylem geri alınamaz"
},
"app.instance.confirm-delete.delete-button": {
"message": "İçeriği Sil"
},
"app.instance.confirm-delete.header": {
"message": "İçeriği Sil"
},
"app.instance.modpack-already-installed.body": {
"message": "Bu mod paketi zaten <bold>{instanceName}</bold> örneğinde yüklü. Kopyalamak istediğinizden emin misiniz?"
},
"app.instance.modpack-already-installed.create": {
"message": "Oluştur"
"app.instance.modpack-already-installed.create-anyway": {
"message": "Yinede oluştur"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpaketi zaten kurulu"
},
"app.instance.modpack-already-installed.instance": {
"message": "İçerik"
},
"app.instance.mods.content-type-project": {
"message": "proje"
},
"app.instance.mods.copy-link": {
"message": "Bağlantıyı kopyala"
},
"app.instance.mods.installing": {
"message": "Kuruluyor..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpaketi"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" eklendi"
},
@@ -98,56 +56,17 @@
"app.instance.mods.share-text": {
"message": "Modpaketimde kullandığım projelere göz at!"
},
"app.instance.mods.share-title": {
"message": "Mod paketi içeriğini paylaşıyorsunuz"
"app.instance.mods.show-file": {
"message": "Dosya göster"
},
"app.instance.mods.successfully-uploaded": {
"message": "Başarı ile yüklendi"
},
"app.instance.worlds.add-server": {
"message": "Sunucu Ekle"
"app.instance.mods.unknown-version": {
"message": "Bilinmeyen"
},
"app.instance.worlds.browse-servers": {
"message": "Sunucuya göz at"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' kalıcı olarak silinecek ve geri getirilmesi mümkün olmayacaktır."
},
"app.instance.worlds.delete-world-title": {
"message": "Bu dünyayı kalıcı olarak silmek istediğinizden emin misiniz?"
},
"app.instance.worlds.filter-modded": {
"message": "Modlu"
},
"app.instance.worlds.filter-offline": {
"message": "Çevrimdışı"
},
"app.instance.worlds.filter-online": {
"message": "Çevrimiçi"
},
"app.instance.worlds.filter-vanilla": {
"message": "Vanilla"
},
"app.instance.worlds.no-worlds-description": {
"message": "Başlamak için bir sunucu ekleyin veya göz atın"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Eklenmiş sunucu veya dünya yok"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' oyun içi dahil olmak üzere listenizden kaldırılacak ve geri getirilmesi mümkün olmayacaktır."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) oyun içi dahil olmak üzere listenizden kaldırılacak ve geri getirilmesi mümkün olmayacaktır."
},
"app.instance.worlds.remove-server-title": {
"message": "{name} öğesini kaldırmak istediğinizden emin misiniz?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "{count} dünya ara..."
},
"app.instance.worlds.this-server": {
"message": "bu sunucu"
"app.instance.mods.updating": {
"message": "Güncelleniyor..."
},
"app.modal.install-to-play.content-required": {
"message": "İçerik gerekli"
@@ -197,6 +116,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Varsayılan profil seçenekleri"
},
"app.settings.tabs.feature-flags": {
"message": "Özellik bayrakları"
},
"app.settings.tabs.java-installations": {
"message": "Java kurulumları"
},
@@ -251,24 +173,6 @@
"app.update.reload-to-update": {
"message": "Güncellemeyi kurmak için yeniden yükleyin"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Bir seçenek seçin"
},
"app.world.world-item.incompatible-version": {
"message": "Uyumsuz sürüm {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Henüz oynanmadı"
},
"app.world.world-item.offline": {
"message": "Çevrimdışı"
},
"app.world.world-item.players-online": {
"message": "{count} çevrimiçi"
},
"friends.action.add-friend": {
"message": "Bir arkadaş ekle"
},
@@ -368,12 +272,6 @@
"instance.edit-world.title": {
"message": "Dünyayı düzenle"
},
"instance.files.adding-files": {
"message": "Dosyalar ekleniyor ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Farklı kaydet..."
},
"instance.server-modal.address": {
"message": "Adres"
},
@@ -545,6 +443,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Ana sayfada gösterme"
},
"instance.worlds.filter.available": {
"message": "Kullanılabilir"
},
"instance.worlds.game_already_open": {
"message": "Bu kurulum zaten açık"
},
@@ -569,6 +470,12 @@
"instance.worlds.play_instance": {
"message": "Kurulumu oyna"
},
"instance.worlds.type.server": {
"message": "Sunucu"
},
"instance.worlds.type.singleplayer": {
"message": "Tek Oyunculu"
},
"instance.worlds.view_instance": {
"message": "Kurulumu gör"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Не вдається зв’язатися зі серверами автентифікації"
},
"app.browse.add-server-to-instance": {
"message": "Додати сервер до профілю"
},
"app.browse.add-servers-to-instance": {
"message": "Додати сервера до вашого профілю"
},
"app.browse.add-to-instance": {
"message": "Додати до профілю"
},
"app.browse.add-to-instance-name": {
"message": "Додати до «{instanceName}»"
},
"app.browse.added": {
"message": "Додано"
},
"app.browse.already-added": {
"message": "Уже додано"
},
"app.browse.discover-content": {
"message": "Дослідити вміст"
},
"app.browse.discover-servers": {
"message": "Дослідити сервера"
},
"app.browse.hide-added-servers": {
"message": "Сховати додані сервера"
},
"app.browse.hide-installed-content": {
"message": "Сховати встановлений уміст"
},
"app.browse.install-content-to-instance": {
"message": "Установити вміст в профіль"
},
"app.export-modal.description-placeholder": {
"message": "Уведіть опис збірки…"
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Видалити профіль"
},
"app.instance.modpack-already-installed.body": {
"message": я збірка вже встановлена в профілі <bold>«{instanceName}»</bold>. Ви впевнені, що хочете її скопіювати?"
"app.instance.modpack-already-installed.admonition-body": {
"message": ю збірку вже встановлено в профілі «{instanceName}»."
},
"app.instance.modpack-already-installed.create": {
"message": "Створити"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Дублікат збірки"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Все одно створити"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Перейти до профілю"
},
"app.instance.modpack-already-installed.header": {
"message": "Збірку вже встановлено"
},
"app.instance.modpack-already-installed.instance": {
"message": "Профіль"
},
"app.instance.mods.content-type-project": {
"message": "проєкт"
},
"app.instance.mods.copy-link": {
"message": "Копіювати посилання"
},
"app.instance.mods.installing": {
"message": "Установлення…"
},
"app.instance.mods.modpack-fallback": {
"message": "Збірка"
},
"app.instance.mods.project-was-added": {
"message": "«{name}» було додано"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Поширення вмісту збірки"
},
"app.instance.mods.show-file": {
"message": "Показати файл"
},
"app.instance.mods.successfully-uploaded": {
"message": "Успішно вивантажено"
},
"app.instance.worlds.add-server": {
"message": "Додати сервер"
"app.instance.mods.unknown-version": {
"message": "Невідомо"
},
"app.instance.worlds.browse-servers": {
"message": "Переглянути сервера"
},
"app.instance.worlds.delete-world-description": {
"message": "«{name}» буде **назавжди видалено** й у вас не буде можливости відновлення."
},
"app.instance.worlds.delete-world-title": {
"message": "Ви впевнені, що хочете назавжди видалити цей світ?"
},
"app.instance.worlds.filter-modded": {
"message": "Модифікований"
},
"app.instance.worlds.filter-offline": {
"message": "Поза мережею"
},
"app.instance.worlds.filter-online": {
"message": "У мережі"
},
"app.instance.worlds.filter-vanilla": {
"message": "Ванільний"
},
"app.instance.worlds.no-worlds-description": {
"message": "Додати сервер або переглянути, щоб почати"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Сервера або світи не додано"
},
"app.instance.worlds.remove-server-description": {
"message": "«{name}» буде видалено з вашого списку, включно в грі, і без можливости відновлення."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "«{name}» ({address}) буде видалено з вашого списку, включно в грі, і без можливости відновлення."
},
"app.instance.worlds.remove-server-title": {
"message": "Ви впевнені, що хочете видалити «{name}»?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Пошук {count} світів…"
},
"app.instance.worlds.this-server": {
"message": "цей сервер"
"app.instance.mods.updating": {
"message": "Оновлення…"
},
"app.modal.install-to-play.content-required": {
"message": "Потрібний уміст"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Усталені налашт. профілю"
},
"app.settings.tabs.feature-flags": {
"message": "Спеціальні функції"
},
"app.settings.tabs.java-installations": {
"message": "Інсталяції Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Перезавантажте, щоб установити оновлення"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Виберіть опцію"
},
"app.world.world-item.incompatible-version": {
"message": "Несумісна версія {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Ще не зіграно"
},
"app.world.world-item.offline": {
"message": "Поза мережею"
},
"app.world.world-item.players-online": {
"message": "{count} у мережі"
},
"friends.action.add-friend": {
"message": "Додати друга"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Редагувати світ"
},
"instance.files.adding-files": {
"message": "Додавання файлів ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Зберегти як…"
},
"instance.server-modal.address": {
"message": "Адреса"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Не показувати на головній"
},
"instance.worlds.filter.available": {
"message": "Доступно"
},
"instance.worlds.game_already_open": {
"message": "Профіль вже запущений"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Грати у профіль"
},
"instance.worlds.type.server": {
"message": "Сервер"
},
"instance.worlds.type.singleplayer": {
"message": "Гра наодинці"
},
"instance.worlds.view_instance": {
"message": "Переглянути профіль"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "Không thể kết nối đến máy chủ xác thực"
},
"app.browse.add-server-to-instance": {
"message": "Thêm máy chủ vào hồ sơ"
},
"app.browse.add-servers-to-instance": {
"message": "Thêm máy chủ vào hồ sơ của bạn"
},
"app.browse.add-to-instance": {
"message": "Thêm vào hồ sơ"
},
"app.browse.add-to-instance-name": {
"message": "Thêm vào {instanceName}"
},
"app.browse.added": {
"message": "Đã thêm"
},
"app.browse.already-added": {
"message": "Đã được thêm"
},
"app.browse.discover-content": {
"message": "Khám phá nội dung"
},
"app.browse.discover-servers": {
"message": "Khám phá máy chủ"
},
"app.browse.hide-added-servers": {
"message": "Ẩn các máy chủ đã thêm"
},
"app.browse.hide-installed-content": {
"message": "Ẩn các nội dung đã được tải xuống"
},
"app.browse.install-content-to-instance": {
"message": "Tải nội dung này vào hồ sơ"
},
"app.export-modal.description-placeholder": {
"message": "Thêm miêu tả cho gói modpack..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "Xoá hồ sơ"
},
"app.instance.modpack-already-installed.body": {
"message": "Gói modpack này đã được cài đặt trong hồ sơ <bold>{instanceName}</bold> rồi. Bạn có chắc chắn muốn sao chép nó không?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "Modpack này đã được cài đặt trong phiên chơi \"{instanceName}\"."
},
"app.instance.modpack-already-installed.create": {
"message": "Khởi tạo"
"app.instance.modpack-already-installed.admonition-header": {
"message": "Nhân bản modpack"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "Vẫn tiếp tục tạo"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "Đi đến phiên chơi"
},
"app.instance.modpack-already-installed.header": {
"message": "Modpack đã được cài đặt"
},
"app.instance.modpack-already-installed.instance": {
"message": "Hồ sơ"
},
"app.instance.mods.content-type-project": {
"message": "Dự án"
},
"app.instance.mods.copy-link": {
"message": "Sao chép liên kết"
},
"app.instance.mods.installing": {
"message": "Đang tải xuống..."
},
"app.instance.mods.modpack-fallback": {
"message": "Modpack"
},
"app.instance.mods.project-was-added": {
"message": "\"{name}\" đã được thêm"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "Chia sẻ hồ sơ modpack"
},
"app.instance.mods.show-file": {
"message": "Hiện tệp"
},
"app.instance.mods.successfully-uploaded": {
"message": "Tải lên thành công"
},
"app.instance.worlds.add-server": {
"message": "Thêm máy chủ"
"app.instance.mods.unknown-version": {
"message": "Không rõ"
},
"app.instance.worlds.browse-servers": {
"message": "Tìm kiếm máy chủ"
},
"app.instance.worlds.delete-world-description": {
"message": "'{name}' sẽ bị **xóa vĩnh viễn** và không có cách nào khôi phục lại."
},
"app.instance.worlds.delete-world-title": {
"message": "Bạn có chắc cắn rằng bạn muốn xoá vĩnh viễn thế giới này không?"
},
"app.instance.worlds.filter-modded": {
"message": "Modded"
},
"app.instance.worlds.filter-offline": {
"message": "Ngoại tuyến"
},
"app.instance.worlds.filter-online": {
"message": "Trực tuyến"
},
"app.instance.worlds.filter-vanilla": {
"message": "Vanilla"
},
"app.instance.worlds.no-worlds-description": {
"message": "Thêm một máy chủ hoặc tìm kiếm để bắt đầu"
},
"app.instance.worlds.no-worlds-heading": {
"message": "Không có máy chủ hay thế giới nào đã được thêm"
},
"app.instance.worlds.remove-server-description": {
"message": "'{name}' sẽ bị xóa khỏi danh sách của bạn, kể cả trong game, và bạn sẽ không có cách nào để khôi phục lại."
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "'{name}' ({address}) sẽ bị xóa khỏi danh sách của bạn, kể cả trong game, và bạn sẽ không có cách nào để khôi phục lại."
},
"app.instance.worlds.remove-server-title": {
"message": "Bạn có chắc chắn rằng bạn muốn xoá {name}?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "Tìm kiếm {count} world..."
},
"app.instance.worlds.this-server": {
"message": "Máy chủ này"
"app.instance.mods.updating": {
"message": "Đang cập nhật..."
},
"app.modal.install-to-play.content-required": {
"message": "Nội dung bắt buộc"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "Tuỳ chọn hồ sơ khởi chạy mặc định"
},
"app.settings.tabs.feature-flags": {
"message": "Các cờ tính năng"
},
"app.settings.tabs.java-installations": {
"message": "Các bản cài Java"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "Hãy khởi động lại để cài đặt bản cập nhật"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "Chọn một tuỳ chọn"
},
"app.world.world-item.incompatible-version": {
"message": "Không phù hợp với phiên bản {version}"
},
"app.world.world-item.not-played-yet": {
"message": "Chưa từng được chơi"
},
"app.world.world-item.offline": {
"message": "Ngoại tuyến"
},
"app.world.world-item.players-online": {
"message": "{count} đang trực tuyến"
},
"friends.action.add-friend": {
"message": "Thêm một người bạn"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "Chỉnh sửa thế giới"
},
"instance.files.adding-files": {
"message": "Đang thêm dữ liệu ({completed}/{total})"
},
"instance.files.save-as": {
"message": "Lưu như..."
},
"instance.server-modal.address": {
"message": "Địa chỉ"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "Không hiện ở Trang chủ"
},
"instance.worlds.filter.available": {
"message": "Có sẵn"
},
"instance.worlds.game_already_open": {
"message": "Bản này đã mở sẵn"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "Chơi phiên bản này"
},
"instance.worlds.type.server": {
"message": "Máy chủ"
},
"instance.worlds.type.singleplayer": {
"message": "Chế độ một người chơi"
},
"instance.worlds.view_instance": {
"message": "Xem phiên bản"
},
+39 -108
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "无法连接到身份验证服务器"
},
"app.browse.add-server-to-instance": {
"message": "将服务器添加到实例"
},
"app.browse.add-servers-to-instance": {
"message": "将服务器添加到你的实例"
},
"app.browse.add-to-instance": {
"message": "添加到实例"
},
"app.browse.add-to-instance-name": {
"message": "添加到 {instanceName}"
},
"app.browse.added": {
"message": "已添加"
},
"app.browse.already-added": {
"message": "已添加过"
},
"app.browse.discover-content": {
"message": "发现内容"
},
"app.browse.discover-servers": {
"message": "发现服务器"
},
"app.browse.hide-added-servers": {
"message": "隐藏已添加的服务器"
},
"app.browse.hide-installed-content": {
"message": "隐藏已安装的实例"
},
"app.browse.install-content-to-instance": {
"message": "将内容安装到实例中"
},
"app.export-modal.description-placeholder": {
"message": "输入整合包描述……"
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "删除实例"
},
"app.instance.modpack-already-installed.body": {
"message": "整合包已经安装到实例<bold>{instanceName}</bold>中了。你确定要重复安装吗?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "这个整合包已经安装在\"{instanceName}\"实例中了。"
},
"app.instance.modpack-already-installed.create": {
"message": "创建"
"app.instance.modpack-already-installed.admonition-header": {
"message": "重复的整合包"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "在任何地方创建"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "前往实例"
},
"app.instance.modpack-already-installed.header": {
"message": "整合包已安装"
},
"app.instance.modpack-already-installed.instance": {
"message": "实例"
},
"app.instance.mods.content-type-project": {
"message": "项目"
},
"app.instance.mods.copy-link": {
"message": "复制链接"
},
"app.instance.mods.installing": {
"message": "正在安装……"
},
"app.instance.mods.modpack-fallback": {
"message": "整合包"
},
"app.instance.mods.project-was-added": {
"message": "已添加“{name}”"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "分享整合包内容"
},
"app.instance.mods.show-file": {
"message": "显示文件"
},
"app.instance.mods.successfully-uploaded": {
"message": "上传成功"
},
"app.instance.worlds.add-server": {
"message": "添加服务器"
"app.instance.mods.unknown-version": {
"message": "未知"
},
"app.instance.worlds.browse-servers": {
"message": "浏览服务器"
},
"app.instance.worlds.delete-world-description": {
"message": "“{name}”将被**永久删除**,并且无法恢复。"
},
"app.instance.worlds.delete-world-title": {
"message": "你确定要永久删除这个世界吗?"
},
"app.instance.worlds.filter-modded": {
"message": "修改版"
},
"app.instance.worlds.filter-offline": {
"message": "离线"
},
"app.instance.worlds.filter-online": {
"message": "在线"
},
"app.instance.worlds.filter-vanilla": {
"message": "原版"
},
"app.instance.worlds.no-worlds-description": {
"message": "添加一个服务器或点击浏览来开始"
},
"app.instance.worlds.no-worlds-heading": {
"message": "未添加服务器或世界"
},
"app.instance.worlds.remove-server-description": {
"message": "将从你的列表中删除“{name}”,包括游戏内,并且无法恢复。"
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "将从你的列表中删除“{name}”({address}),包括游戏内,并且无法恢复。"
},
"app.instance.worlds.remove-server-title": {
"message": "你确定要删除 {name} 吗?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "搜索 {count} 个世界……"
},
"app.instance.worlds.this-server": {
"message": "此服务器"
"app.instance.mods.updating": {
"message": "更新中……"
},
"app.modal.install-to-play.content-required": {
"message": "内容需求"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "默认实例选项"
},
"app.settings.tabs.feature-flags": {
"message": "功能开关"
},
"app.settings.tabs.java-installations": {
"message": "Java 管理"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "重启以安装更新"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "选择一个选项"
},
"app.world.world-item.incompatible-version": {
"message": "不兼容的版本 {version}"
},
"app.world.world-item.not-played-yet": {
"message": "暂未游玩"
},
"app.world.world-item.offline": {
"message": "离线"
},
"app.world.world-item.players-online": {
"message": "{count} 人在线"
},
"friends.action.add-friend": {
"message": "添加好友"
},
@@ -285,7 +213,7 @@
"message": "这可能与对方的 Minecraft 用户名不同!"
},
"friends.add-friend.username.placeholder": {
"message": "输入 Modrinth 用户名…"
"message": "输入 Modrinth 用户名…"
},
"friends.add-friend.username.title": {
"message": "你好友的 Modrinth 用户名是什么?"
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "编辑存档"
},
"instance.files.adding-files": {
"message": "正在添加文件({completed}/{total}"
},
"instance.files.save-as": {
"message": "保存为……"
},
"instance.server-modal.address": {
"message": "地址"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "在主界面隐藏"
},
"instance.worlds.filter.available": {
"message": "可用"
},
"instance.worlds.game_already_open": {
"message": "实例已启动"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "游玩实例"
},
"instance.worlds.type.server": {
"message": "服务器"
},
"instance.worlds.type.singleplayer": {
"message": "单人游戏"
},
"instance.worlds.view_instance": {
"message": "查看实例"
},
+38 -107
View File
@@ -5,39 +5,6 @@
"app.auth-servers.unreachable.header": {
"message": "無法連線到驗證伺服器"
},
"app.browse.add-server-to-instance": {
"message": "新增此伺服器到實例中"
},
"app.browse.add-servers-to-instance": {
"message": "新增伺服器到實例中"
},
"app.browse.add-to-instance": {
"message": "新增至實例"
},
"app.browse.add-to-instance-name": {
"message": "新增到 {instanceName}"
},
"app.browse.added": {
"message": "已新增"
},
"app.browse.already-added": {
"message": "已新增"
},
"app.browse.discover-content": {
"message": "探索內容"
},
"app.browse.discover-servers": {
"message": "探索伺服器"
},
"app.browse.hide-added-servers": {
"message": "隱藏已新增的伺服器"
},
"app.browse.hide-installed-content": {
"message": "隱藏已安裝的內容"
},
"app.browse.install-content-to-instance": {
"message": "安裝至實例中"
},
"app.export-modal.description-placeholder": {
"message": "輸入模組包描述..."
},
@@ -74,21 +41,33 @@
"app.instance.confirm-delete.header": {
"message": "刪除實例"
},
"app.instance.modpack-already-installed.body": {
"message": "模組包已經安裝在<bold>{instanceName}</bold> 實例中了,您確定要再次安裝嗎?"
"app.instance.modpack-already-installed.admonition-body": {
"message": "這個模組包已經安裝在{instanceName}」實例中了。"
},
"app.instance.modpack-already-installed.create": {
"message": "建立"
"app.instance.modpack-already-installed.admonition-header": {
"message": "複製模組包"
},
"app.instance.modpack-already-installed.create-anyway": {
"message": "仍要建立"
},
"app.instance.modpack-already-installed.go-to-instance": {
"message": "前往實例"
},
"app.instance.modpack-already-installed.header": {
"message": "模組包已經安裝"
},
"app.instance.modpack-already-installed.instance": {
"message": "實例"
},
"app.instance.mods.content-type-project": {
"message": "專案"
},
"app.instance.mods.copy-link": {
"message": "複製連結"
},
"app.instance.mods.installing": {
"message": "安裝中..."
},
"app.instance.mods.modpack-fallback": {
"message": "模組包"
},
"app.instance.mods.project-was-added": {
"message": "新增了「{name}」"
},
@@ -101,53 +80,17 @@
"app.instance.mods.share-title": {
"message": "分享模組包內容"
},
"app.instance.mods.show-file": {
"message": "顯示檔案"
},
"app.instance.mods.successfully-uploaded": {
"message": "上傳成功"
},
"app.instance.worlds.add-server": {
"message": "新增伺服器"
"app.instance.mods.unknown-version": {
"message": "未知"
},
"app.instance.worlds.browse-servers": {
"message": "瀏覽伺服器"
},
"app.instance.worlds.delete-world-description": {
"message": "「{name}」將會被**永久刪除**,且無法還原。"
},
"app.instance.worlds.delete-world-title": {
"message": "你確定要永久刪除這個世界嗎?"
},
"app.instance.worlds.filter-modded": {
"message": "模組"
},
"app.instance.worlds.filter-offline": {
"message": "離線"
},
"app.instance.worlds.filter-online": {
"message": "線上"
},
"app.instance.worlds.filter-vanilla": {
"message": "原版"
},
"app.instance.worlds.no-worlds-description": {
"message": "新增伺服器或瀏覽以開始使用"
},
"app.instance.worlds.no-worlds-heading": {
"message": "未新增任何伺服器或世界"
},
"app.instance.worlds.remove-server-description": {
"message": "「{name}」將從你的清單中移除(包含遊戲內),且無法還原。"
},
"app.instance.worlds.remove-server-description-with-address": {
"message": "「{name}」({address}) 將從你的清單中移除(包含遊戲內),且無法還原。"
},
"app.instance.worlds.remove-server-title": {
"message": "你確定要移除「{name}」嗎?"
},
"app.instance.worlds.search-worlds-placeholder": {
"message": "搜尋 {count} 個世界..."
},
"app.instance.worlds.this-server": {
"message": "這個伺服器"
"app.instance.mods.updating": {
"message": "更新中..."
},
"app.modal.install-to-play.content-required": {
"message": "所需內容"
@@ -197,6 +140,9 @@
"app.settings.tabs.default-instance-options": {
"message": "預設實例選項"
},
"app.settings.tabs.feature-flags": {
"message": "功能開關"
},
"app.settings.tabs.java-installations": {
"message": "Java 安裝"
},
@@ -251,24 +197,6 @@
"app.update.reload-to-update": {
"message": "重新載入即可安裝更新"
},
"app.world.server-modal.placeholder-address": {
"message": "example.modrinth.gg"
},
"app.world.server-modal.select-an-option": {
"message": "選擇選項"
},
"app.world.world-item.incompatible-version": {
"message": "不相容的版本 {version}"
},
"app.world.world-item.not-played-yet": {
"message": "尚未遊玩"
},
"app.world.world-item.offline": {
"message": "離線"
},
"app.world.world-item.players-online": {
"message": "{count} 人在線上"
},
"friends.action.add-friend": {
"message": "新增好友"
},
@@ -368,12 +296,6 @@
"instance.edit-world.title": {
"message": "編輯世界"
},
"instance.files.adding-files": {
"message": "正在新增檔案 ({completed}/{total})"
},
"instance.files.save-as": {
"message": "另存新檔..."
},
"instance.server-modal.address": {
"message": "位址"
},
@@ -545,6 +467,9 @@
"instance.worlds.dont_show_on_home": {
"message": "不要在首頁顯示"
},
"instance.worlds.filter.available": {
"message": "可用"
},
"instance.worlds.game_already_open": {
"message": "實例已經開啟"
},
@@ -569,6 +494,12 @@
"instance.worlds.play_instance": {
"message": "遊戲實例"
},
"instance.worlds.type.server": {
"message": "伺服器"
},
"instance.worlds.type.singleplayer": {
"message": "單人遊戲"
},
"instance.worlds.view_instance": {
"message": "檢視實例"
},
+111 -273
View File
@@ -1,7 +1,6 @@
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import {
CheckIcon,
ClipboardCopyIcon,
ExternalIcon,
GlobeIcon,
@@ -15,12 +14,10 @@ import {
Admonition,
ButtonStyled,
Checkbox,
commonMessages,
defineMessages,
DropdownSelect,
injectNotificationManager,
LoadingIndicator,
NavTabs,
Pagination,
ProjectCard,
ProjectCardList,
@@ -36,11 +33,12 @@ import { openUrl } from '@tauri-apps/plugin-opener'
import type { Ref } from 'vue'
import { computed, nextTick, onUnmounted, ref, shallowRef, toRaw, watch } from 'vue'
import type { LocationQuery } from 'vue-router'
import { onBeforeRouteLeave, useRoute, useRouter } from 'vue-router'
import { useRoute, useRouter } from 'vue-router'
import ContextMenu from '@/components/ui/ContextMenu.vue'
import type Instance from '@/components/ui/Instance.vue'
import InstanceIndicator from '@/components/ui/InstanceIndicator.vue'
import NavTabs from '@/components/ui/NavTabs.vue'
import SearchCard from '@/components/ui/SearchCard.vue'
import { get_project_v3, get_search_results_v3 } from '@/helpers/cache.js'
import { process_listener } from '@/helpers/events'
@@ -53,7 +51,7 @@ import {
} from '@/helpers/profile.js'
import { get_categories, get_game_versions, get_loaders } from '@/helpers/tags'
import type { GameInstance } from '@/helpers/types'
import { add_server_to_profile, get_profile_worlds, getServerLatency } from '@/helpers/worlds'
import { getServerLatency } from '@/helpers/worlds'
import { injectServerInstall } from '@/providers/server-install'
import { useBreadcrumbs } from '@/store/breadcrumbs'
import { getServerAddress } from '@/store/install.js'
@@ -110,27 +108,19 @@ const installedProjectIds: Ref<string[] | null> = ref(null)
const instanceHideInstalled = ref(false)
const newlyInstalled = ref<string[]>([])
const isServerInstance = ref(false)
const isFromWorlds = computed(() => route.query.from === 'worlds')
if (isFromWorlds.value && route.params.projectType !== 'server') {
router.replace({
path: '/browse/server',
query: route.query,
})
}
const allInstalledIds = computed(
() => new Set([...newlyInstalled.value, ...(installedProjectIds.value ?? [])]),
)
const PERSISTENT_QUERY_PARAMS = ['i', 'ai', 'from']
const PERSISTENT_QUERY_PARAMS = ['i', 'ai']
await initInstanceContext()
async function initInstanceContext() {
debugLog('initInstanceContext', { queryI: route.query.i, queryAi: route.query.ai })
if (route.query.i) {
instance.value = (await getInstance(route.query.i as string).catch(handleError)) ?? null
instance.value = await getInstance(route.query.i).catch(handleError)
debugLog('instance loaded', {
name: instance.value?.name,
loader: instance.value?.loader,
@@ -140,24 +130,12 @@ async function initInstanceContext() {
// Load installed project IDs in background — the page and initial search render immediately.
// When this resolves, instanceFilters recomputes and triggers a search refresh
// that applies the "hide installed" negative filters and marks installed badges.
if (route.query.from === 'worlds') {
get_profile_worlds(route.query.i as string)
.then((worlds) => {
const serverProjectIds = worlds
.filter((w) => w.type === 'server' && 'project_id' in w && w.project_id)
.map((w) => (w as { project_id: string }).project_id)
debugLog('installedServerProjectIds loaded', { count: serverProjectIds.length })
installedProjectIds.value = serverProjectIds
})
.catch(handleError)
} else {
getInstalledProjectIds(route.query.i as string)
.then((ids) => {
debugLog('installedProjectIds loaded', { count: ids?.length })
installedProjectIds.value = ids
})
.catch(handleError)
}
getInstalledProjectIds(route.query.i)
.then((ids) => {
debugLog('installedProjectIds loaded', { count: ids?.length })
installedProjectIds.value = ids
})
.catch(handleError)
if (instance.value?.linked_data?.project_id) {
debugLog('checking linked project for server status', instance.value.linked_data.project_id)
@@ -268,10 +246,6 @@ const activeGameVersion = computed(() => {
})
const serverHits = shallowRef<Labrinth.Search.v3.ResultSearchProject[]>([])
const filteredServerHits = computed(() => {
if (!instanceHideInstalled.value || allInstalledIds.value.size === 0) return serverHits.value
return serverHits.value.filter((hit) => !allInstalledIds.value.has(hit.project_id))
})
const serverPings = shallowRef<Record<string, number | undefined>>({})
const runningServerProjects = ref<Record<string, string>>({})
@@ -307,28 +281,11 @@ async function handlePlayServerProject(projectId: string) {
checkServerRunningStates(serverHits.value)
}
async function handleAddServerToInstance(project: Labrinth.Search.v3.ResultSearchProject) {
function handleAddServerToInstance(project: Labrinth.Search.v3.ResultSearchProject) {
debugLog('handleAddServerToInstance', { projectId: project.project_id, name: project.name })
const address = getServerAddress(project.minecraft_java_server)
if (!address) return
if (instance.value) {
try {
await add_server_to_profile(
instance.value.path,
project.name,
address,
'prompt',
project.project_id,
project.minecraft_java_server?.content?.kind,
)
newlyInstalled.value.push(project.project_id)
} catch (err) {
handleError(err as Error)
}
} else {
showAddServerToInstanceModal(project.name, address)
}
showAddServerToInstanceModal(project.name, address)
}
const unlistenProcesses = await process_listener(
@@ -360,16 +317,6 @@ const {
createServerPageParams,
} = useServerSearch({ tags, query, maxResults, currentPage })
if (instance.value?.game_version) {
const gv = instance.value.game_version
const alreadyHasGv = serverCurrentFilters.value.some(
(f) => f.type === 'server_game_version' && f.option === gv,
)
if (!alreadyHasGv) {
serverCurrentFilters.value.push({ type: 'server_game_version', option: gv })
}
}
async function pingServerHits(hits: Labrinth.Search.v3.ResultSearchProject[]) {
debugLog('pingServerHits', { hitCount: hits.length })
const pingsToFetch = hits.filter((hit) => hit.minecraft_java_server?.address)
@@ -399,107 +346,8 @@ window.addEventListener('online', () => {
offline.value = false
})
const messages = defineMessages({
addServerToInstance: {
id: 'app.browse.add-server-to-instance',
defaultMessage: 'Add server to instance',
},
addServersToInstance: {
id: 'app.browse.add-servers-to-instance',
defaultMessage: 'Add servers to your instance',
},
addToInstance: {
id: 'app.browse.add-to-instance',
defaultMessage: 'Add to instance',
},
addToInstanceName: {
id: 'app.browse.add-to-instance-name',
defaultMessage: 'Add to {instanceName}',
},
added: {
id: 'app.browse.added',
defaultMessage: 'Added',
},
alreadyAdded: {
id: 'app.browse.already-added',
defaultMessage: 'Already added',
},
discoverContent: {
id: 'app.browse.discover-content',
defaultMessage: 'Discover content',
},
discoverServers: {
id: 'app.browse.discover-servers',
defaultMessage: 'Discover servers',
},
environmentProvidedByServer: {
id: 'search.filter.locked.server-environment.title',
defaultMessage: 'Only client-side mods can be added to the server instance',
},
gameVersionProvidedByInstance: {
id: 'search.filter.locked.instance-game-version.title',
defaultMessage: 'Game version is provided by the instance',
},
gameVersionProvidedByServer: {
id: 'search.filter.locked.server-game-version.title',
defaultMessage: 'Game version is provided by the server',
},
hideAddedServers: {
id: 'app.browse.hide-added-servers',
defaultMessage: 'Hide added servers',
},
hideInstalledContent: {
id: 'app.browse.hide-installed-content',
defaultMessage: 'Hide installed content',
},
installContentToInstance: {
id: 'app.browse.install-content-to-instance',
defaultMessage: 'Install content to instance',
},
modLoaderProvidedByInstance: {
id: 'search.filter.locked.instance-loader.title',
defaultMessage: 'Loader is provided by the instance',
},
modLoaderProvidedByServer: {
id: 'search.filter.locked.server-loader.title',
defaultMessage: 'Loader is provided by the server',
},
providedByInstance: {
id: 'search.filter.locked.instance',
defaultMessage: 'Provided by the instance',
},
providedByServer: {
id: 'search.filter.locked.server',
defaultMessage: 'Provided by the server',
},
syncFilterButton: {
id: 'search.filter.locked.instance.sync',
defaultMessage: 'Sync with instance',
},
})
const breadcrumbs = useBreadcrumbs()
const browseTitle = computed(() =>
formatMessage(isFromWorlds.value ? messages.discoverServers : messages.discoverContent),
)
breadcrumbs.setName('BrowseTitle', browseTitle.value)
if (instance.value) {
const instanceLink = `/instance/${encodeURIComponent(instance.value.path)}`
breadcrumbs.setContext({
name: instance.value.name,
link: isFromWorlds.value ? `${instanceLink}/worlds` : instanceLink,
})
} else {
breadcrumbs.setContext(null)
}
onBeforeRouteLeave(() => {
breadcrumbs.setContext({
name: browseTitle.value,
link: `/browse/${projectType.value}`,
query: route.query,
})
})
breadcrumbs.setContext({ name: 'Discover content', link: route.path, query: route.query })
const loading = ref(true)
@@ -636,6 +484,11 @@ async function refreshSearch() {
...(isServer ? createServerPageParams() : createPageParams()),
}
breadcrumbs.setContext({
name: 'Discover content',
link: `/browse/${projectType.value}`,
query: params,
})
debugLog('updating URL', params)
router.replace({ path: route.path, query: params })
@@ -679,18 +532,6 @@ watch(
debugLog('projectType route param changed', { from: projectType.value, to: newType })
projectType.value = newType
// If instance context was removed (e.g. sidebar browse navigation), reset state
if (!route.query.i && instance.value) {
debugLog('instance context removed, resetting')
instance.value = null
installedProjectIds.value = null
instanceHideInstalled.value = false
newlyInstalled.value = []
isServerInstance.value = false
breadcrumbs.setName('BrowseTitle', formatMessage(messages.discoverContent))
breadcrumbs.setContext(null)
}
currentSortType.value = { display: 'Relevance', name: 'relevance' }
query.value = ''
},
@@ -728,25 +569,64 @@ const selectableProjectTypes = computed(() => {
if (route.query.ai) {
params.ai = route.query.ai
}
if (route.query.from) {
params.from = route.query.from
}
const queryString = new URLSearchParams(params as Record<string, string>).toString()
const suffix = queryString ? `?${queryString}` : ''
if (isFromWorlds.value) {
return [{ label: 'Servers', href: `/browse/server${suffix}` }]
}
return [
{ label: 'Modpacks', href: `/browse/modpack${suffix}`, shown: modpacks },
{ label: 'Mods', href: `/browse/mod${suffix}`, shown: mods },
{ label: 'Resource Packs', href: `/browse/resourcepack${suffix}` },
{ label: 'Data Packs', href: `/browse/datapack${suffix}`, shown: dataPacks },
{ label: 'Shaders', href: `/browse/shader${suffix}` },
{ label: 'Servers', href: `/browse/server${suffix}`, shown: !instance.value },
const links = [
{ label: 'Modpacks', href: `/browse/modpack`, shown: modpacks },
{ label: 'Mods', href: `/browse/mod`, shown: mods },
{ label: 'Resource Packs', href: `/browse/resourcepack` },
{ label: 'Data Packs', href: `/browse/datapack`, shown: dataPacks },
{ label: 'Shaders', href: `/browse/shader` },
{ label: 'Servers', href: `/browse/server`, shown: !instance.value },
]
if (params) {
return links.map((link) => {
return {
...link,
href: {
path: link.href,
query: params,
},
}
})
}
return links
})
const messages = defineMessages({
gameVersionProvidedByInstance: {
id: 'search.filter.locked.instance-game-version.title',
defaultMessage: 'Game version is provided by the instance',
},
gameVersionProvidedByServer: {
id: 'search.filter.locked.server-game-version.title',
defaultMessage: 'Game version is provided by the server',
},
modLoaderProvidedByInstance: {
id: 'search.filter.locked.instance-loader.title',
defaultMessage: 'Loader is provided by the instance',
},
modLoaderProvidedByServer: {
id: 'search.filter.locked.server-loader.title',
defaultMessage: 'Loader is provided by the server',
},
environmentProvidedByServer: {
id: 'search.filter.locked.server-environment.title',
defaultMessage: 'Only client-side mods can be added to the server instance',
},
providedByInstance: {
id: 'search.filter.locked.instance',
defaultMessage: 'Provided by the instance',
},
providedByServer: {
id: 'search.filter.locked.server',
defaultMessage: 'Provided by the server',
},
syncFilterButton: {
id: 'search.filter.locked.instance.sync',
defaultMessage: 'Sync with instance',
},
})
const getServerModpackContent = (project: Labrinth.Search.v3.ResultSearchProject) => {
@@ -817,9 +697,7 @@ previousFilterState.value = JSON.stringify({
>
<Checkbox
v-model="instanceHideInstalled"
:label="
formatMessage(isFromWorlds ? messages.hideAddedServers : messages.hideInstalledContent)
"
label="Hide installed content"
class="filter-checkbox"
@update:model-value="onSearchChangeToTop()"
@click.prevent.stop
@@ -898,15 +776,9 @@ previousFilterState.value = JSON.stringify({
</Teleport>
<div ref="searchWrapper" class="flex flex-col gap-3 p-6">
<template v-if="instance">
<InstanceIndicator :instance="instance" :back-tab="isFromWorlds ? 'worlds' : undefined" />
<h1 class="m-0 mb-1 text-xl">
{{
formatMessage(
isFromWorlds ? messages.addServersToInstance : messages.installContentToInstance,
)
}}
</h1>
<Admonition v-if="isServerInstance && !isFromWorlds" type="warning" class="mb-1">
<InstanceIndicator :instance="instance" />
<h1 class="m-0 mb-1 text-xl">Install content to instance</h1>
<Admonition v-if="isServerInstance" type="warning" class="mb-1">
Adding content can break compatibility when joining the server. Any added content will also
be lost when you update the server instance content.
</Admonition>
@@ -978,7 +850,7 @@ previousFilterState.value = JSON.stringify({
<section
v-else-if="
projectType === 'server'
? filteredServerHits.length === 0
? serverHits.length === 0
: results && results.hits && results.hits.length === 0
"
class="offline"
@@ -989,7 +861,7 @@ previousFilterState.value = JSON.stringify({
<ProjectCardList v-else :layout="'list'">
<template v-if="projectType === 'server'">
<ProjectCard
v-for="project in filteredServerHits"
v-for="project in serverHits"
:key="`server-card-${project.project_id}`"
:title="project.name"
:icon-url="project.icon_url || undefined"
@@ -1015,71 +887,37 @@ previousFilterState.value = JSON.stringify({
>
<template #actions>
<div class="flex gap-2">
<template v-if="isFromWorlds && instance">
<ButtonStyled color="brand" type="outlined">
<button
:disabled="allInstalledIds.has(project.project_id)"
@click.stop="() => handleAddServerToInstance(project)"
>
<CheckIcon v-if="allInstalledIds.has(project.project_id)" />
<PlusIcon v-else />
{{
formatMessage(
allInstalledIds.has(project.project_id)
? messages.added
: messages.addToInstance,
)
}}
</button>
</ButtonStyled>
</template>
<template v-else>
<ButtonStyled circular>
<button
v-tooltip="
allInstalledIds.has(project.project_id)
? formatMessage(messages.alreadyAdded)
: instance
? formatMessage(messages.addToInstanceName, {
instanceName: instance.name,
})
: formatMessage(messages.addServerToInstance)
"
:disabled="allInstalledIds.has(project.project_id)"
@click.stop="() => handleAddServerToInstance(project)"
>
<CheckIcon v-if="allInstalledIds.has(project.project_id)" />
<PlusIcon v-else />
</button>
</ButtonStyled>
<ButtonStyled
v-if="runningServerProjects[project.project_id]"
color="red"
type="outlined"
<ButtonStyled circular>
<button
v-tooltip="'Add server to instance'"
@click.stop="() => handleAddServerToInstance(project)"
>
<button @click="() => handleStopServerProject(project.project_id)">
<StopCircleIcon />
{{ formatMessage(commonMessages.stopButton) }}
</button>
</ButtonStyled>
<ButtonStyled v-else color="brand" type="outlined">
<button
:disabled="
(installingServerProjects as string[]).includes(project.project_id)
"
@click="() => handlePlayServerProject(project.project_id)"
>
<PlayIcon />
{{
formatMessage(
(installingServerProjects as string[]).includes(project.project_id)
? commonMessages.installingLabel
: commonMessages.playButton,
)
}}
</button>
</ButtonStyled>
</template>
<PlusIcon />
</button>
</ButtonStyled>
<ButtonStyled
v-if="runningServerProjects[project.project_id]"
color="red"
type="outlined"
>
<button @click="() => handleStopServerProject(project.project_id)">
<StopCircleIcon />
Stop
</button>
</ButtonStyled>
<ButtonStyled v-else color="brand" type="outlined">
<button
:disabled="(installingServerProjects as string[]).includes(project.project_id)"
@click="() => handlePlayServerProject(project.project_id)"
>
<PlayIcon />
{{
(installingServerProjects as string[]).includes(project.project_id)
? 'Installing...'
: 'Play'
}}
</button>
</ButtonStyled>
</div>
</template>
</ProjectCard>
@@ -1,345 +0,0 @@
<script setup lang="ts">
import type { EditingFile, FileItem, UploadState } from '@modrinth/ui'
import {
commonMessages,
defineMessages,
FilePageLayout,
injectNotificationManager,
provideFileManager,
useDebugLogger,
useVIntl,
} from '@modrinth/ui'
import { invoke } from '@tauri-apps/api/core'
import {
mkdir,
readDir,
readFile as readFileBytes,
readTextFile,
remove,
rename,
stat,
writeFile as writeFileBytes,
writeTextFile,
} from '@tauri-apps/plugin-fs'
import { onUnmounted, ref, watch } from 'vue'
import { profile_listener } from '@/helpers/events'
import { get_full_path } from '@/helpers/profile'
import type { GameInstance } from '@/helpers/types'
import { highlightInFolder } from '@/helpers/utils'
const props = defineProps<{
instance: GameInstance
options: unknown
offline: boolean
playing: boolean
installed: boolean
isServerInstance: boolean
}>()
const { formatMessage } = useVIntl()
const { addNotification } = injectNotificationManager()
const debug = useDebugLogger('Files')
const messages = defineMessages({
saveAs: {
id: 'instance.files.save-as',
defaultMessage: 'Save as...',
},
addingFiles: {
id: 'instance.files.adding-files',
defaultMessage: 'Adding files ({completed}/{total})',
},
})
const instanceRoot = ref('')
const items = ref<FileItem[]>([])
const loading = ref(true)
const error = ref<Error | null>(null)
const currentPath = ref('')
const editingFile = ref<EditingFile | null>(null)
debug('setup: start, instance.path =', props.instance.path)
instanceRoot.value = await get_full_path(props.instance.path)
debug('setup: instanceRoot =', instanceRoot.value)
await refresh()
debug('setup: refresh complete, items =', items.value.length, 'error =', error.value)
function resolvePath(relativePath: string): string {
return relativePath ? `${instanceRoot.value}/${relativePath}` : instanceRoot.value
}
async function listDirectory(dirPath: string): Promise<FileItem[]> {
const absPath = resolvePath(dirPath)
debug('listDirectory: dirPath =', dirPath, 'absPath =', absPath)
const entries = await readDir(absPath)
debug('listDirectory: got', entries.length, 'entries')
const results = await Promise.all(
entries.map(async (entry) => {
const entryAbsPath = `${absPath}/${entry.name}`
let metadata
try {
metadata = await stat(entryAbsPath)
} catch {
debug('listDirectory: stat failed for', entry.name, '- skipping')
return null
}
const item: FileItem = {
name: entry.name,
type: entry.isDirectory ? 'directory' : 'file',
path: dirPath ? `${dirPath}/${entry.name}` : entry.name,
modified: metadata.mtime ? Math.floor(metadata.mtime.getTime() / 1000) : 0,
created: metadata.birthtime ? Math.floor(metadata.birthtime.getTime() / 1000) : 0,
}
if (!entry.isDirectory) {
item.size = metadata.size
}
if (entry.isDirectory) {
try {
const children = await readDir(entryAbsPath)
item.count = children.length
} catch {
item.count = 0
}
}
return item
}),
)
return results.filter((item): item is FileItem => item !== null)
}
async function refresh() {
debug('refresh: called, currentPath =', currentPath.value, 'instanceRoot =', instanceRoot.value)
loading.value = true
error.value = null
try {
items.value = await listDirectory(currentPath.value)
debug('refresh: success, items =', items.value.length)
} catch (e) {
debug('refresh: error =', e)
error.value = e instanceof Error ? e : new Error(String(e))
items.value = []
} finally {
loading.value = false
}
}
function navigateTo(path: string) {
debug('navigateTo:', path)
currentPath.value = path.startsWith('/') ? path.slice(1) : path
refresh()
}
function startEditing(file: EditingFile) {
editingFile.value = file
}
function stopEditing() {
editingFile.value = null
}
async function handleCreateItem(name: string, type: 'file' | 'directory') {
const targetPath = currentPath.value ? `${currentPath.value}/${name}` : name
const absPath = resolvePath(targetPath)
try {
if (type === 'directory') {
await mkdir(absPath)
} else {
await writeTextFile(absPath, '')
}
await refresh()
} catch (e) {
addNotification({
title: formatMessage(commonMessages.createFailedLabel),
text: e instanceof Error ? e.message : '',
type: 'error',
})
}
}
async function handleRenameItem(path: string, newName: string) {
const oldAbs = resolvePath(path)
const parentDir = path.includes('/') ? path.substring(0, path.lastIndexOf('/')) : ''
const newPath = parentDir ? `${parentDir}/${newName}` : newName
const newAbs = resolvePath(newPath)
try {
await rename(oldAbs, newAbs)
await refresh()
} catch (e) {
addNotification({
title: formatMessage(commonMessages.renameFailedLabel),
text: e instanceof Error ? e.message : '',
type: 'error',
})
}
}
async function handleMoveItem(source: string, destination: string) {
try {
await rename(resolvePath(source), resolvePath(destination))
await refresh()
} catch (e) {
addNotification({
title: formatMessage(commonMessages.moveFailedLabel),
text: e instanceof Error ? e.message : '',
type: 'error',
})
}
}
async function handleDeleteItem(path: string, recursive: boolean) {
try {
await remove(resolvePath(path), { recursive })
await refresh()
} catch (e) {
addNotification({
title: formatMessage(commonMessages.deleteFailedLabel),
text: e instanceof Error ? e.message : '',
type: 'error',
})
}
}
async function handleReadFile(path: string): Promise<string> {
return await readTextFile(resolvePath(path))
}
async function handleReadFileAsBlob(path: string): Promise<Blob> {
const bytes = await readFileBytes(resolvePath(path))
return new Blob([bytes])
}
async function handleWriteFile(path: string, content: string) {
await writeTextFile(resolvePath(path), content)
}
async function handleDownloadFile(path: string, _fileName: string) {
await invoke('plugin:files|file_save_as', {
instancePath: props.instance.path,
filePath: path,
})
}
const uploadState = ref<UploadState>({
isUploading: false,
currentFileName: null,
currentFileProgress: 0,
uploadedBytes: 0,
totalBytes: 0,
completedFiles: 0,
totalFiles: 0,
})
async function handleUploadFiles(files: File[]) {
if (files.length === 0) return
uploadState.value = {
isUploading: true,
currentFileName: '',
currentFileProgress: 0,
uploadedBytes: 0,
totalBytes: files.reduce((sum, f) => sum + f.size, 0),
completedFiles: 0,
totalFiles: files.length,
}
try {
for (const file of files) {
uploadState.value.currentFileName = file.name
const buffer = await file.arrayBuffer()
const targetPath = resolvePath(
currentPath.value ? `${currentPath.value}/${file.name}` : file.name,
)
await writeFileBytes(targetPath, new Uint8Array(buffer))
uploadState.value.completedFiles++
uploadState.value.uploadedBytes += file.size
uploadState.value.currentFileProgress = 1
}
} catch (e) {
addNotification({
title: formatMessage(commonMessages.uploadFailedLabel),
text: e instanceof Error ? e.message : '',
type: 'error',
})
} finally {
uploadState.value.isUploading = false
await refresh()
}
}
async function handleExtractFile(path: string, override: boolean, dry: boolean) {
try {
return await invoke('plugin:files|file_extract_zip', {
instancePath: props.instance.path,
filePath: path,
overrideConflicts: override,
dryRun: dry,
})
} catch (e) {
addNotification({
title: formatMessage(commonMessages.extractFailedLabel),
text: e instanceof Error ? e.message : '',
type: 'error',
})
}
}
debug('setup: registering profile_listener')
const unlistenProfiles = await profile_listener(
async (event: { event: string; profile_path_id: string }) => {
debug('profile_listener: event =', event.event, 'path =', event.profile_path_id)
if (event.profile_path_id === props.instance.path && event.event === 'synced') {
debug('profile_listener: synced event matched, calling refresh')
await refresh()
}
},
)
debug('setup: profile_listener registered')
onUnmounted(() => {
unlistenProfiles()
})
watch(
() => props.instance.path,
async () => {
debug('watch instance.path: changed to', props.instance.path)
instanceRoot.value = await get_full_path(props.instance.path)
currentPath.value = ''
await refresh()
},
)
provideFileManager({
items,
loading,
error,
currentPath,
navigateTo,
editingFile,
startEditing,
stopEditing,
createItem: handleCreateItem,
renameItem: handleRenameItem,
moveItem: handleMoveItem,
deleteItem: handleDeleteItem,
readFile: handleReadFile,
readFileAsBlob: handleReadFileAsBlob,
writeFile: handleWriteFile,
downloadFile: handleDownloadFile,
uploadFiles: handleUploadFiles,
uploadState,
extractFile: handleExtractFile,
refresh,
basePath: instanceRoot,
openInFolder: (path: string) => highlightInFolder(path),
downloadButtonLabel: formatMessage(messages.saveAs),
uploadingLabel: (completed: number, total: number) =>
formatMessage(messages.addingFiles, { completed, total }),
})
</script>
<template>
<FilePageLayout :show-refresh-button="true" />
</template>
+22 -12
View File
@@ -3,7 +3,6 @@
<div class="p-6 pr-2 pb-4" @contextmenu.prevent.stop="(event) => handleRightClick(event)">
<ExportModal ref="exportModal" :instance="instance" />
<InstanceSettingsModal
:key="instance.path"
ref="settingsModal"
:instance="instance"
:offline="offline"
@@ -37,6 +36,27 @@
</template>
<template v-else> Never played </template>
</div>
<div v-if="linkedProjectV3" class="w-1.5 h-1.5 rounded-full bg-surface-5"></div>
<div
v-if="linkedProjectV3"
class="flex gap-1.5 items-center font-medium text-primary"
>
Linked to
<Avatar
:src="linkedProjectV3.icon_url"
:alt="linkedProjectV3.name"
:tint-by="instance.path"
size="24px"
/>
<router-link
:to="`/project/${linkedProjectV3.slug ?? linkedProjectV3.id}`"
class="hover:underline text-primary truncate"
>
{{ linkedProjectV3.name }}
</router-link>
</div>
</template>
<template v-else>
@@ -265,7 +285,6 @@
<script setup lang="ts">
import type { Labrinth } from '@modrinth/api-client'
import {
BoxesIcon,
CheckCircleIcon,
ClipboardCopyIcon,
DownloadIcon,
@@ -283,7 +302,6 @@ import {
ServerIcon,
SettingsIcon,
StopCircleIcon,
TerminalSquareIcon,
UpdatedIcon,
UserPlusIcon,
XIcon,
@@ -294,7 +312,6 @@ import {
ContentPageHeader,
injectNotificationManager,
LoadingIndicator,
NavTabs,
OverflowMenu,
ServerOnlinePlayers,
ServerPing,
@@ -312,6 +329,7 @@ import ContextMenu from '@/components/ui/ContextMenu.vue'
import ExportModal from '@/components/ui/ExportModal.vue'
import InstanceSettingsModal from '@/components/ui/modal/InstanceSettingsModal.vue'
import UpdateToPlayModal from '@/components/ui/modal/UpdateToPlayModal.vue'
import NavTabs from '@/components/ui/NavTabs.vue'
import { trackEvent } from '@/helpers/analytics'
import { get_project_v3 } from '@/helpers/cache.js'
import { process_listener, profile_listener } from '@/helpers/events'
@@ -433,22 +451,14 @@ const tabs = computed(() => [
{
label: 'Content',
href: `${basePath.value}`,
icon: BoxesIcon,
},
{
label: 'Files',
href: `${basePath.value}/files`,
icon: FolderOpenIcon,
},
{
label: 'Worlds',
href: `${basePath.value}/worlds`,
icon: GlobeIcon,
},
{
label: 'Logs',
href: `${basePath.value}/logs`,
icon: TerminalSquareIcon,
},
])
+67 -44
View File
@@ -13,7 +13,6 @@
:modpack-icon-url="linkedModpackProject?.icon_url ?? undefined"
:enable-toggle="!props.isServerInstance"
:get-overflow-options="getOverflowOptions"
:switch-version="handleSwitchVersion"
@update:enabled="handleModpackContentToggle"
@bulk:enable="handleModpackContentBulkToggle"
@bulk:disable="handleModpackContentBulkToggle"
@@ -48,7 +47,7 @@
"
:project-name="
updatingModpack
? (linkedModpackProject?.title ?? formatMessage(commonMessages.modpackLabel))
? (linkedModpackProject?.title ?? formatMessage(messages.modpackFallback))
: (updatingProject?.project?.title ?? updatingProject?.file_name)
"
:loading="loadingVersions"
@@ -66,9 +65,7 @@
import type { Labrinth } from '@modrinth/api-client'
import { ClipboardCopyIcon, FolderOpenIcon } from '@modrinth/assets'
import {
commonMessages,
ConfirmModpackUpdateModal,
ContentCardLayout as ContentPageLayout,
type ContentItem,
type ContentModpackCardCategory,
type ContentModpackCardProject,
@@ -85,6 +82,7 @@ import {
useDebugLogger,
useVIntl,
} from '@modrinth/ui'
import { ContentCardLayout as ContentPageLayout } from '@modrinth/ui'
import { getCurrentWebview } from '@tauri-apps/api/webview'
import { open } from '@tauri-apps/plugin-dialog'
import { openUrl } from '@tauri-apps/plugin-opener'
@@ -127,6 +125,10 @@ const messages = defineMessages({
id: 'app.instance.mods.share-text',
defaultMessage: "Check out the projects I'm using in my modpack!",
},
modpackFallback: {
id: 'app.instance.mods.modpack-fallback',
defaultMessage: 'Modpack',
},
successfullyUploaded: {
id: 'app.instance.mods.successfully-uploaded',
defaultMessage: 'Successfully uploaded',
@@ -139,10 +141,30 @@ const messages = defineMessages({
id: 'app.instance.mods.projects-were-added',
defaultMessage: '{count} projects were added',
},
updating: {
id: 'app.instance.mods.updating',
defaultMessage: 'Updating...',
},
installing: {
id: 'app.instance.mods.installing',
defaultMessage: 'Installing...',
},
contentTypeProject: {
id: 'app.instance.mods.content-type-project',
defaultMessage: 'project',
},
unknownVersion: {
id: 'app.instance.mods.unknown-version',
defaultMessage: 'Unknown',
},
showFile: {
id: 'app.instance.mods.show-file',
defaultMessage: 'Show file',
},
copyLink: {
id: 'app.instance.mods.copy-link',
defaultMessage: 'Copy link',
},
})
let savedModalState: ModpackContentModalState | null = null
@@ -261,7 +283,7 @@ async function handleUploadFiles() {
}
}
async function toggleDisableMod(mod: ContentItem) {
async function _toggleDisableMod(mod: ContentItem) {
try {
mod.file_path = await toggle_disable_project(props.instance.path, mod.file_path!)
mod.enabled = !mod.enabled
@@ -279,7 +301,7 @@ async function toggleDisableMod(mod: ContentItem) {
}
}
const toggleDisableDebounced = useDebounceFn(toggleDisableMod, 20)
const toggleDisableMod = useDebounceFn(_toggleDisableMod, 20)
async function removeMod(mod: ContentItem) {
await remove_project(props.instance.path, mod.file_path!).catch(handleError)
@@ -332,12 +354,6 @@ async function updateProject(mod: ContentItem) {
}
async function switchProjectVersion(mod: ContentItem, version: Labrinth.Versions.v2.Version) {
isBulkOperating.value = true
mod.installing = true
if (mod.version) {
mod.version.id = version.id
mod.version.version_number = version.version_number
}
try {
await remove_project(props.instance.path, mod.file_path!)
const newPath = await add_project_from_version(props.instance.path, version.id)
@@ -348,12 +364,20 @@ async function switchProjectVersion(mod: ContentItem, version: Labrinth.Versions
}
mod.file_path = newPath
if (mod.version) {
mod.version.id = version.id
mod.version.version_number = version.version_number
}
trackEvent('InstanceProjectSwitchVersion', {
loader: props.instance.loader,
game_version: props.instance.game_version,
id: mod.project?.id,
name: mod.project?.title ?? mod.file_name,
project_type: mod.project_type,
})
} catch (err) {
handleError(err as Error)
} finally {
mod.installing = false
isBulkOperating.value = false
await initProjects()
}
}
@@ -444,11 +468,11 @@ async function handleSwitchVersion(item: ContentItem) {
}
async function handleModpackContentToggle(item: ContentItem) {
await toggleDisableDebounced(item)
await toggleDisableMod(item)
}
async function handleModpackContentBulkToggle(items: ContentItem[]) {
await Promise.all(items.map((item) => toggleDisableMod(item)))
await Promise.all(items.map((item) => _toggleDisableMod(item)))
}
async function handleModpackContent() {
@@ -515,7 +539,7 @@ async function fetchAndSpliceVersion(
async function handleVersionSelect(version: Labrinth.Versions.v2.Version) {
if (version.changelog != null) return
loadingChangelog.value = true
await fetchAndSpliceVersion(version.id, 'must_revalidate', handleError as (err: unknown) => void)
await fetchAndSpliceVersion(version.id, 'must_revalidate', handleError)
loadingChangelog.value = false
}
@@ -636,14 +660,14 @@ function getOverflowOptions(item: ContentItem): OverflowMenuOption[] {
const options: OverflowMenuOption[] = []
options.push({
id: formatMessage(commonMessages.showFileButton),
id: formatMessage(messages.showFile),
icon: FolderOpenIcon,
action: () => highlightModInProfile(props.instance.path, item.file_path),
})
if (item.project?.slug) {
options.push({
id: formatMessage(commonMessages.copyLinkButton),
id: formatMessage(messages.copyLink),
icon: ClipboardCopyIcon,
action: async () => {
await navigator.clipboard.writeText(
@@ -694,13 +718,18 @@ async function initProjects(cacheBehaviour?: CacheBehaviour) {
if (allCategories && modpackInfo.project.categories) {
const seen = new Set<string>()
linkedModpackCategories.value = allCategories.filter((cat: { name: string }) => {
if (modpackInfo.project.categories.includes(cat.name) && !seen.has(cat.name)) {
seen.add(cat.name)
return true
}
return false
})
linkedModpackCategories.value = allCategories
.filter((cat: { name: string }) => {
if (modpackInfo.project.categories.includes(cat.name) && !seen.has(cat.name)) {
seen.add(cat.name)
return true
}
return false
})
.map((cat: { name: string }) => ({
...cat,
name: cat.name.charAt(0).toUpperCase() + cat.name.slice(1),
}))
} else {
linkedModpackCategories.value = []
}
@@ -770,8 +799,8 @@ provideContentManager({
hasUpdate: linkedModpackHasUpdate.value,
disabled: isModpackUpdating.value,
disabledText: isModpackUpdating.value
? formatMessage(commonMessages.updatingLabel)
: formatMessage(commonMessages.installingLabel),
? formatMessage(messages.updating)
: formatMessage(messages.installing),
}
: null,
),
@@ -779,18 +808,13 @@ provideContentManager({
isBusy: isInstanceBusy,
isBulkOperating,
contentTypeLabel: ref(formatMessage(messages.contentTypeProject)),
toggleEnabled: toggleDisableDebounced,
bulkEnableItems: (items: ContentItem[]) =>
Promise.all(items.filter((item) => !item.enabled).map((item) => toggleDisableMod(item))).then(
() => {},
),
bulkDisableItems: (items: ContentItem[]) =>
Promise.all(items.filter((item) => item.enabled).map((item) => toggleDisableMod(item))).then(
() => {},
),
toggleEnabled: toggleDisableMod,
bulkEnableItems: (items) =>
Promise.all(items.map((item) => _toggleDisableMod(item))).then(() => {}),
bulkDisableItems: (items) =>
Promise.all(items.map((item) => _toggleDisableMod(item))).then(() => {}),
deleteItem: removeMod,
bulkDeleteItems: (items: ContentItem[]) =>
Promise.all(items.map((item) => removeMod(item))).then(() => {}),
bulkDeleteItems: (items) => Promise.all(items.map((item) => removeMod(item))).then(() => {}),
refresh: () => initProjects('must_revalidate'),
browse: handleBrowseContent,
uploadFiles: handleUploadFiles,
@@ -806,7 +830,7 @@ provideContentManager({
showContentHint,
dismissContentHint,
shareItems: handleShareItems,
mapToTableItem: (item: ContentItem) => ({
mapToTableItem: (item) => ({
id: item.id,
project: item.project ?? {
id: item.file_name,
@@ -819,7 +843,7 @@ provideContentManager({
: undefined,
version: item.version ?? {
id: item.file_name,
version_number: formatMessage(commonMessages.unknownLabel),
version_number: formatMessage(messages.unknownVersion),
file_name: item.file_name,
},
versionLink:
@@ -836,7 +860,6 @@ provideContentManager({
}
: undefined,
enabled: item.enabled,
installing: item.installing,
}),
filterPersistKey: props.instance.path,
})
+107 -253
View File
@@ -15,88 +15,48 @@
<EditWorldModal ref="editWorldModal" :instance="instance" @submit="editWorld" />
<ConfirmModalWrapper
ref="removeServerModal"
:title="
formatMessage(messages.removeServerTitle, {
name: serverToRemove?.name ?? formatMessage(messages.thisServer),
})
"
:description="
serverToRemove?.address === serverToRemove?.name
? formatMessage(messages.removeServerDescription, { name: serverToRemove?.name })
: formatMessage(messages.removeServerDescriptionWithAddress, {
name: serverToRemove?.name,
address: serverToRemove?.address,
})
"
:title="`Are you sure you want to remove ${serverToRemove?.name ?? 'this server'}?`"
:description="`'${serverToRemove?.name}'${serverToRemove?.address === serverToRemove?.name ? ' ' : ` (${serverToRemove?.address})`} will be removed from your list, including in-game, and there will be no way to recover it.`"
:markdown="false"
@proceed="proceedRemoveServer"
/>
<ConfirmModalWrapper
ref="deleteWorldModal"
:title="formatMessage(messages.deleteWorldTitle)"
:description="formatMessage(messages.deleteWorldDescription, { name: worldToDelete?.name })"
:title="`Are you sure you want to permanently delete this world?`"
:description="`'${worldToDelete?.name}' will be **permanently deleted**, and there will be no way to recover it.`"
@proceed="proceedDeleteWorld"
/>
<div v-if="dedupedWorlds.length > 0" class="flex flex-col gap-4">
<div class="flex flex-wrap items-center gap-2">
<div class="flex flex-wrap gap-2 items-center">
<StyledInput
v-model="searchFilter"
:icon="SearchIcon"
type="text"
placeholder="Search worlds..."
autocomplete="off"
:spellcheck="false"
input-class="!h-10"
wrapper-class="flex-1 min-w-0"
clearable
:placeholder="
formatMessage(messages.searchWorldsPlaceholder, { count: dedupedWorlds.length })
"
wrapper-class="flex-grow"
/>
<div class="flex gap-2">
<ButtonStyled type="outlined">
<button class="!h-10 !border-button-bg !border-[1px]" @click="addServerModal?.show()">
<PlusIcon class="size-5" />
{{ formatMessage(messages.addServer) }}
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button
class="!h-10 flex items-center gap-2"
@click="
router.push({ path: '/browse/server', query: { i: instance.path, from: 'worlds' } })
"
>
<CompassIcon class="size-5" />
<span>{{ formatMessage(messages.browseServers) }}</span>
</button>
</ButtonStyled>
</div>
</div>
<div class="flex flex-wrap items-center justify-between gap-2">
<div class="flex flex-wrap items-center gap-1.5">
<FilterIcon class="size-5 text-secondary" />
<button
:class="filterPillClass(selectedFilters.length === 0)"
@click="selectedFilters = []"
>
{{ formatMessage(commonMessages.allProjectType) }}
</button>
<button
v-for="option in filterOptions"
:key="option.id"
:class="filterPillClass(selectedFilters.includes(option.id))"
@click="toggleFilter(option.id)"
>
{{ option.label }}
</button>
</div>
<ButtonStyled type="transparent" hover-color-fill="none">
<ButtonStyled>
<button :disabled="refreshingAll" @click="refreshAllWorlds">
<RefreshCwIcon :class="refreshingAll ? 'animate-spin' : ''" />
{{ formatMessage(commonMessages.refreshButton) }}
<template v-if="refreshingAll">
<SpinnerIcon class="animate-spin" />
Refreshing...
</template>
<template v-else>
<UpdatedIcon />
Refresh
</template>
</button>
</ButtonStyled>
<ButtonStyled>
<button @click="addServerModal?.show()">
<PlusIcon />
Add a server
</button>
</ButtonStyled>
</div>
<FilterBar v-model="filters" :options="filterOptions" show-all-options />
<div class="flex flex-col w-full gap-2">
<WorldItem
v-for="world in filteredWorlds"
@@ -132,49 +92,51 @@
/>
</div>
</div>
<EmptyState
v-else
type="empty-inbox"
:heading="formatMessage(messages.noWorldsHeading)"
:description="formatMessage(messages.noWorldsDescription)"
>
<template #actions>
<ButtonStyled type="outlined">
<button class="!h-10 !border-button-bg !border-[1px]" @click="addServerModal?.show()">
<PlusIcon class="size-5" />
{{ formatMessage(messages.addServer) }}
<div v-else class="w-full max-w-[48rem] mx-auto flex flex-col mt-6">
<RadialHeader class="">
<div class="flex items-center gap-6 w-[32rem] mx-auto">
<img src="@/assets/sad-modrinth-bot.webp" alt="" aria-hidden="true" class="h-24" />
<span class="text-contrast font-bold text-xl"> You don't have any worlds yet. </span>
</div>
</RadialHeader>
<div class="flex gap-2 mt-4 mx-auto">
<ButtonStyled>
<button @click="addServerModal?.show()">
<PlusIcon aria-hidden="true" />
Add a server
</button>
</ButtonStyled>
<ButtonStyled color="brand">
<button
class="!h-10 flex items-center gap-2"
@click="
router.push({ path: '/browse/server', query: { i: instance.path, from: 'worlds' } })
"
>
<CompassIcon class="size-5" />
<span>{{ formatMessage(messages.browseServers) }}</span>
<ButtonStyled>
<button :disabled="refreshingAll" @click="refreshAllWorlds">
<template v-if="refreshingAll">
<SpinnerIcon aria-hidden="true" class="animate-spin" />
Refreshing...
</template>
<template v-else>
<UpdatedIcon aria-hidden="true" />
Refresh
</template>
</button>
</ButtonStyled>
</template>
</EmptyState>
</div>
</div>
</template>
<script setup lang="ts">
import { CompassIcon, FilterIcon, PlusIcon, RefreshCwIcon, SearchIcon } from '@modrinth/assets'
import { PlusIcon, SearchIcon, SpinnerIcon, UpdatedIcon } from '@modrinth/assets'
import {
ButtonStyled,
commonMessages,
defineMessages,
EmptyState,
FilterBar,
type FilterBarOption,
GAME_MODES,
type GameVersion,
injectNotificationManager,
RadialHeader,
StyledInput,
useVIntl,
} from '@modrinth/ui'
import { platform } from '@tauri-apps/plugin-os'
import { computed, onUnmounted, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { useRoute } from 'vue-router'
import type ContextMenu from '@/components/ui/ContextMenu.vue'
import ConfirmModalWrapper from '@/components/ui/modal/ConfirmModalWrapper.vue'
@@ -214,80 +176,11 @@ import {
type World,
} from '@/helpers/worlds.ts'
import { injectServerInstall } from '@/providers/server-install'
import { handleSevereError } from '@/store/error.js'
import { ensureManagedServerWorldExists, getServerAddress } from '@/store/install'
const messages = defineMessages({
removeServerTitle: {
id: 'app.instance.worlds.remove-server-title',
defaultMessage: 'Are you sure you want to remove {name}?',
},
removeServerDescription: {
id: 'app.instance.worlds.remove-server-description',
defaultMessage:
"'{name}' will be removed from your list, including in-game, and there will be no way to recover it.",
},
removeServerDescriptionWithAddress: {
id: 'app.instance.worlds.remove-server-description-with-address',
defaultMessage:
"'{name}' ({address}) will be removed from your list, including in-game, and there will be no way to recover it.",
},
deleteWorldTitle: {
id: 'app.instance.worlds.delete-world-title',
defaultMessage: 'Are you sure you want to permanently delete this world?',
},
deleteWorldDescription: {
id: 'app.instance.worlds.delete-world-description',
defaultMessage:
"'{name}' will be **permanently deleted**, and there will be no way to recover it.",
},
searchWorldsPlaceholder: {
id: 'app.instance.worlds.search-worlds-placeholder',
defaultMessage: 'Search {count} worlds...',
},
addServer: {
id: 'app.instance.worlds.add-server',
defaultMessage: 'Add server',
},
browseServers: {
id: 'app.instance.worlds.browse-servers',
defaultMessage: 'Browse servers',
},
noWorldsHeading: {
id: 'app.instance.worlds.no-worlds-heading',
defaultMessage: 'No servers or worlds added',
},
noWorldsDescription: {
id: 'app.instance.worlds.no-worlds-description',
defaultMessage: 'Add a server or browse to get started',
},
thisServer: {
id: 'app.instance.worlds.this-server',
defaultMessage: 'this server',
},
vanillaFilter: {
id: 'app.instance.worlds.filter-vanilla',
defaultMessage: 'Vanilla',
},
moddedFilter: {
id: 'app.instance.worlds.filter-modded',
defaultMessage: 'Modded',
},
onlineFilter: {
id: 'app.instance.worlds.filter-online',
defaultMessage: 'Online',
},
offlineFilter: {
id: 'app.instance.worlds.filter-offline',
defaultMessage: 'Offline',
},
})
const { formatMessage } = useVIntl()
const { handleError } = injectNotificationManager()
const { playServerProject } = injectServerInstall()
const route = useRoute()
const router = useRouter()
const addServerModal = ref<InstanceType<typeof AddServerModal>>()
const editServerModal = ref<InstanceType<typeof EditServerModal>>()
@@ -318,32 +211,9 @@ function play(world: World) {
emit('play', world)
}
const selectedFilters = ref<string[]>([])
const filters = ref<string[]>([])
const searchFilter = ref('')
function filterPillClass(isActive: boolean) {
return [
'cursor-pointer rounded-full border border-solid px-3 py-1.5 text-base font-semibold leading-5 transition-all duration-100 active:scale-[0.97]',
isActive
? 'border-green bg-brand-highlight text-brand'
: 'border-surface-5 bg-surface-4 text-primary hover:bg-surface-5',
]
}
function toggleFilter(id: string) {
const idx = selectedFilters.value.indexOf(id)
if (idx >= 0) {
selectedFilters.value.splice(idx, 1)
} else {
selectedFilters.value.push(id)
if (id === 'singleplayer') {
selectedFilters.value = selectedFilters.value.filter((f) => f !== 'online' && f !== 'offline')
} else if (id === 'online' || id === 'offline') {
selectedFilters.value = selectedFilters.value.filter((f) => f !== 'singleplayer')
}
}
}
const refreshingAll = ref(false)
const hadNoWorlds = ref(true)
const startingInstance = ref(false)
@@ -501,12 +371,6 @@ async function editServer(server: ServerWorld) {
async function removeServer(server: ServerWorld) {
await remove_server_from_profile(instance.value.path, server.index).catch(handleError)
worlds.value = worlds.value.filter((w) => w.type !== 'server' || w.index !== server.index)
let serverIdx = 0
for (const w of worlds.value) {
if (w.type === 'server') {
w.index = serverIdx++
}
}
}
async function editWorld(path: string, name: string, removeIcon: boolean) {
@@ -529,7 +393,7 @@ async function deleteWorld(world: SingleplayerWorld) {
}
function handleJoinError(err: Error) {
handleSevereError(err, { profilePath: instance.value.path })
handleError(err)
startingInstance.value = false
worldPlaying.value = undefined
}
@@ -634,83 +498,58 @@ const dedupedWorlds = computed(() => {
})
const filterOptions = computed(() => {
const options: { id: string; label: string }[] = []
const hasSingleplayer = dedupedWorlds.value.some((x) => x.type === 'singleplayer')
const options: FilterBarOption[] = []
const hasServer = dedupedWorlds.value.some((x) => x.type === 'server')
const hasStatusFilter =
selectedFilters.value.includes('online') || selectedFilters.value.includes('offline')
if (hasSingleplayer && hasServer && !hasStatusFilter) {
options.push({ id: 'singleplayer', label: formatMessage(commonMessages.singleplayerLabel) })
if (dedupedWorlds.value.some((x) => x.type === 'singleplayer') && hasServer) {
options.push({
id: 'singleplayer',
message: messages.singleplayer,
})
options.push({
id: 'server',
message: messages.server,
})
}
if (hasServer) {
const servers = dedupedWorlds.value.filter((x) => x.type === 'server')
const hasVanilla = servers.some((x) => x.content_kind !== 'modpack')
const hasModded = servers.some((x) => x.content_kind === 'modpack')
if (hasVanilla && hasModded) {
options.push({ id: 'vanilla', label: formatMessage(messages.vanillaFilter) })
options.push({ id: 'modded', label: formatMessage(messages.moddedFilter) })
}
if (!selectedFilters.value.includes('singleplayer')) {
const hasOnline = servers.some((x) => !!serverData.value[x.address]?.status)
const hasOffline = servers.some((x) => !serverData.value[x.address]?.status)
if (hasOnline && hasOffline) {
options.push({ id: 'online', label: formatMessage(messages.onlineFilter) })
options.push({ id: 'offline', label: formatMessage(messages.offlineFilter) })
}
// add available filter if there's any offline ("unavailable") servers AND there's any singleplayer worlds or available servers
if (
dedupedWorlds.value.some(
(x) =>
x.type === 'server' &&
!serverData.value[x.address]?.status &&
!serverData.value[x.address]?.refreshing,
) &&
dedupedWorlds.value.some(
(x) =>
x.type === 'singleplayer' ||
(x.type === 'server' &&
serverData.value[x.address]?.status &&
!serverData.value[x.address]?.refreshing),
)
) {
options.push({
id: 'available',
message: messages.available,
})
}
}
return options
})
watch(filterOptions, (options) => {
const validIds = new Set(options.map((opt) => opt.id))
const cleaned = selectedFilters.value.filter((f) => validIds.has(f))
if (cleaned.length !== selectedFilters.value.length) {
selectedFilters.value = cleaned
}
})
const filteredWorlds = computed(() =>
dedupedWorlds.value.filter((x) => {
if (searchFilter.value && !x.name.toLowerCase().includes(searchFilter.value.toLowerCase())) {
return false
}
const availableFilter = filters.value.includes('available')
const typeFilter = filters.value.includes('server') || filters.value.includes('singleplayer')
if (selectedFilters.value.length === 0) return true
const hasSingleplayerFilter = selectedFilters.value.includes('singleplayer')
const typeFilters = selectedFilters.value.filter((f) => f === 'vanilla' || f === 'modded')
const statusFilters = selectedFilters.value.filter((f) => f === 'online' || f === 'offline')
if (x.type === 'singleplayer') {
return hasSingleplayerFilter || (typeFilters.length === 0 && statusFilters.length === 0)
}
if (hasSingleplayerFilter && typeFilters.length === 0 && statusFilters.length === 0) {
return false
}
let passesType = true
if (typeFilters.length > 0) {
const isModded = x.content_kind === 'modpack'
passesType =
(typeFilters.includes('modded') && isModded) ||
(typeFilters.includes('vanilla') && !isModded)
}
let passesStatus = true
if (statusFilters.length > 0) {
const isOnline = !!serverData.value[x.address]?.status
passesStatus =
(statusFilters.includes('online') && isOnline) ||
(statusFilters.includes('offline') && !isOnline)
}
return passesType && passesStatus
return (
(!typeFilter || filters.value.includes(x.type)) &&
(!availableFilter || x.type !== 'server' || serverData.value[x.address]?.status) &&
(!searchFilter.value || x.name.toLowerCase().includes(searchFilter.value.toLowerCase()))
)
}),
)
@@ -749,4 +588,19 @@ async function proceedDeleteWorld() {
onUnmounted(() => {
unlistenProfile()
})
const messages = defineMessages({
singleplayer: {
id: 'instance.worlds.type.singleplayer',
defaultMessage: 'Singleplayer',
},
server: {
id: 'instance.worlds.type.server',
defaultMessage: 'Server',
},
available: {
id: 'instance.worlds.filter.available',
defaultMessage: 'Available',
},
})
</script>
@@ -1,8 +1,7 @@
import Files from './Files.vue'
import Index from './Index.vue'
import Logs from './Logs.vue'
import Mods from './Mods.vue'
import Overview from './Overview.vue'
import Worlds from './Worlds.vue'
export { Files, Index, Logs, Mods, Overview, Worlds }
export { Index, Logs, Mods, Overview, Worlds }
@@ -1,10 +1,11 @@
<script setup lang="ts">
import { PlusIcon } from '@modrinth/assets'
import { Button, injectNotificationManager, NavTabs } from '@modrinth/ui'
import { Button, injectNotificationManager } from '@modrinth/ui'
import { inject, onUnmounted, ref, shallowRef } from 'vue'
import { useRoute } from 'vue-router'
import { NewInstanceImage } from '@/assets/icons'
import NavTabs from '@/components/ui/NavTabs.vue'
import { profile_listener } from '@/helpers/events.js'
import { list } from '@/helpers/profile.js'
import { useBreadcrumbs } from '@/store/breadcrumbs.js'
+6 -18
View File
@@ -5,7 +5,7 @@
v-if="!isServerProject"
:project="data"
:tags="{ loaders: allLoaders, gameVersions: allGameVersions }"
:project-v3="projectV3"
:v3-metadata="projectV3"
class="project-sidebar-section"
/>
<ProjectSidebarServerInfo
@@ -170,7 +170,10 @@
},
{
label: 'Versions',
href: versionsHref,
href: {
path: `/project/${$route.params.id}/versions`,
query: instanceFilters,
},
subpages: ['version'],
shown: projectV3?.minecraft_server == null,
},
@@ -221,7 +224,6 @@ import {
import {
ButtonStyled,
injectNotificationManager,
NavTabs,
OverflowMenu,
ProjectBackgroundGradient,
ProjectHeader,
@@ -240,6 +242,7 @@ import { useRoute, useRouter } from 'vue-router'
import ContextMenu from '@/components/ui/ContextMenu.vue'
import InstanceIndicator from '@/components/ui/InstanceIndicator.vue'
import NavTabs from '@/components/ui/NavTabs.vue'
import {
get_organization,
get_project,
@@ -315,21 +318,6 @@ const instanceFilters = computed(() => {
return { l: loaders, g: instance.value.game_version }
})
const versionsHref = computed(() => {
const base = `/project/${route.params.id}/versions`
const filters = instanceFilters.value
const params = new URLSearchParams()
for (const [key, val] of Object.entries(filters)) {
if (Array.isArray(val)) {
for (const v of val) params.append(key, v)
} else if (val) {
params.append(key, String(val))
}
}
const qs = params.toString()
return qs ? `${base}?${qs}` : base
})
const [allLoaders, allGameVersions] = await Promise.all([
get_loaders().catch(handleError).then(ref),
get_game_versions().catch(handleError).then(ref),
@@ -133,8 +133,6 @@ export function createContentInstall(opts: {
title: string
icon_url?: string | null
project_type?: string
organization?: string | null
team?: string
},
version?: Labrinth.Versions.v2.Version,
) {
@@ -166,60 +164,6 @@ export function createContentInstall(opts: {
if (items.some((i) => i.file_name === placeholder.file_name)) return
next.set(instancePath, [...items, placeholder])
installingItems.value = next
if (project.organization) {
get_organization(project.organization)
.then((org: { id: string; slug: string; name: string; icon_url?: string }) => {
updateInstallingItem(instancePath, placeholder.file_name, {
owner: {
id: org.id,
name: org.name,
avatar_url: org.icon_url,
type: 'organization',
},
})
})
.catch(() => {})
} else if (project.team) {
get_team(project.team)
.then(
(
members: {
user: { id: string; username: string; avatar_url?: string }
is_owner: boolean
}[],
) => {
const owner = members.find((m) => m.is_owner)
if (owner) {
updateInstallingItem(instancePath, placeholder.file_name, {
owner: {
id: owner.user.id,
name: owner.user.username,
avatar_url: owner.user.avatar_url,
type: 'user',
},
})
}
},
)
.catch(() => {})
}
}
function updateInstallingItem(
instancePath: string,
fileName: string,
updates: Partial<ContentItem>,
) {
const next = new Map(installingItems.value)
const items = next.get(instancePath)
if (!items) return
const index = items.findIndex((i) => i.file_name === fileName)
if (index === -1) return
const updated = [...items]
updated[index] = { ...updated[index], ...updates }
next.set(instancePath, updated)
installingItems.value = next
}
function removeInstallingItems(instancePath: string, projectIds: string[]) {
@@ -1,10 +1,10 @@
import { createContext } from '@modrinth/ui'
import type { ComputedRef, Ref } from 'vue'
import type { Ref } from 'vue'
import type { GameInstance } from '@/helpers/types'
export interface InstanceSettingsContext {
instance: ComputedRef<GameInstance>
instance: GameInstance
offline?: boolean
isMinecraftServer: Ref<boolean>
onUnlinked: () => void
+1 -11
View File
@@ -41,8 +41,7 @@ export default new createRouter({
name: 'Discover content',
component: Pages.Browse,
meta: {
useContext: true,
breadcrumb: [{ name: '?BrowseTitle' }],
breadcrumb: [{ name: 'Discover content' }],
},
},
{
@@ -179,15 +178,6 @@ export default new createRouter({
breadcrumb: [{ name: '?Instance', link: '/instance/{id}/' }, { name: 'Content' }],
},
},
{
path: 'files',
name: 'Files',
component: Instance.Files,
meta: {
useRootContext: true,
breadcrumb: [{ name: '?Instance', link: '/instance/{id}/' }, { name: 'Files' }],
},
},
{
path: 'logs',
name: 'Logs',
+4 -7
View File
@@ -70,17 +70,14 @@ export default defineConfig({
// https://v2.tauri.app/reference/environment-variables/#tauri-cli-hook-commands
envPrefix: ['VITE_', 'TAURI_'],
build: {
rolldownOptions: {
onwarn(warning, defaultHandler) {
if (warning.code === 'INEFFECTIVE_DYNAMIC_IMPORT') return
defaultHandler(warning)
},
},
// Tauri supports es2021
target: process.env.TAURI_ENV_PLATFORM == 'windows' ? 'chrome105' : 'safari13', // eslint-disable-line turbo/no-undeclared-env-vars
// don't minify for debug builds
minify: !process.env.TAURI_ENV_DEBUG, // eslint-disable-line turbo/no-undeclared-env-vars
minify: !process.env.TAURI_ENV_DEBUG ? 'esbuild' : false, // eslint-disable-line turbo/no-undeclared-env-vars
// produce sourcemaps for debug builds
sourcemap: !!process.env.TAURI_ENV_DEBUG, // eslint-disable-line turbo/no-undeclared-env-vars
commonjsOptions: {
esmExternals: true,
},
},
})
-2
View File
@@ -8,7 +8,6 @@ repository = "https://github.com/modrinth/code/apps/app/"
license = "GPL-3.0-only"
[dependencies]
async_zip = { workspace = true, features = ["deflate", "tokio-fs"] }
chrono = { workspace = true }
daedalus = { workspace = true }
dashmap = { workspace = true }
@@ -29,7 +28,6 @@ tauri = { workspace = true, features = [
] }
tauri-plugin-deep-link = { workspace = true }
tauri-plugin-dialog = { workspace = true }
tauri-plugin-fs = { workspace = true }
tauri-plugin-http = { workspace = true }
tauri-plugin-opener = { workspace = true }
tauri-plugin-os = { workspace = true }
-8
View File
@@ -263,14 +263,6 @@ fn main() {
DefaultPermissionRule::AllowAllCommands,
),
)
.plugin(
"files",
InlinedPlugin::new()
.commands(&["file_extract_zip", "file_save_as"])
.default_permission(
DefaultPermissionRule::AllowAllCommands,
),
)
.plugin(
"friends",
InlinedPlugin::new()
-27
View File
@@ -25,32 +25,6 @@
"allow": [{ "url": "https://modrinth.com/*" }, { "url": "https://*.modrinth.com/*" }]
},
"dialog:allow-save",
"fs:allow-read-dir",
"fs:allow-read-file",
"fs:allow-read-text-file",
"fs:allow-write-file",
"fs:allow-write-text-file",
"fs:allow-create",
"fs:allow-remove",
"fs:allow-rename",
"fs:allow-copy-file",
"fs:allow-stat",
"fs:allow-exists",
"fs:allow-mkdir",
{
"identifier": "fs:scope",
"allow": [
{ "path": "$APPDATA/profiles" },
{ "path": "$APPDATA/profiles/**" },
{ "path": "$APPCONFIG/profiles" },
{ "path": "$APPCONFIG/profiles/**" },
{ "path": "$CONFIG/profiles" },
{ "path": "$CONFIG/profiles/**" }
]
},
"auth:default",
"import:default",
"jre:default",
@@ -63,7 +37,6 @@
"process:default",
"profile:default",
"cache:default",
"files:default",
"settings:default",
"tags:default",
"utils:default",
-164
View File
@@ -1,164 +0,0 @@
use crate::api::Result;
use async_zip::base::read::seek::ZipFileReader;
use serde::Serialize;
use std::io::Cursor;
use tauri::Runtime;
use tauri_plugin_dialog::DialogExt;
use theseus::profile::get_full_path;
pub fn init<R: Runtime>() -> tauri::plugin::TauriPlugin<R> {
tauri::plugin::Builder::new("files")
.invoke_handler(tauri::generate_handler![
file_extract_zip,
file_save_as,
])
.build()
}
#[derive(Serialize)]
pub struct ExtractDryRunResult {
modpack_name: Option<String>,
conflicting_files: Vec<String>,
}
#[tauri::command]
pub async fn file_extract_zip(
instance_path: &str,
file_path: &str,
override_conflicts: bool,
dry_run: bool,
) -> Result<Option<ExtractDryRunResult>> {
let base = get_full_path(instance_path).await?;
let zip_path = base.join(file_path);
let canonical_zip = tokio::fs::canonicalize(&zip_path).await?;
let canonical_base = tokio::fs::canonicalize(&base).await?;
if !canonical_zip.starts_with(&canonical_base) {
return Err(theseus::Error::from(theseus::ErrorKind::OtherError(
"file_path escapes the instance directory".to_string(),
))
.into());
}
let extract_dir = zip_path
.parent()
.map(|p| p.to_path_buf())
.unwrap_or_else(|| base.clone());
let file_bytes = tokio::fs::read(&zip_path).await?;
let reader = Cursor::new(file_bytes);
let zip_reader = ZipFileReader::with_tokio(reader).await.map_err(|e| {
theseus::Error::from(theseus::ErrorKind::OtherError(format!(
"Failed to read zip file: {e}"
)))
})?;
let entries: Vec<(usize, String)> = zip_reader
.file()
.entries()
.iter()
.enumerate()
.filter_map(|(i, entry)| {
let name = entry.filename().as_str().ok()?.to_string();
if name.ends_with('/') {
None
} else {
Some((i, name))
}
})
.collect();
if dry_run {
let mut conflicting_files = Vec::new();
let canonical_extract = tokio::fs::canonicalize(&extract_dir).await?;
for (_, name) in &entries {
let target = extract_dir.join(name);
if let Some(parent) = target.parent() {
let normalized = parent
.canonicalize()
.unwrap_or_else(|_| extract_dir.join(parent));
if !normalized.starts_with(&canonical_extract) {
continue;
}
}
if target.exists() {
conflicting_files.push(name.clone());
}
}
return Ok(Some(ExtractDryRunResult {
modpack_name: None,
conflicting_files,
}));
}
let canonical_extract_dir = tokio::fs::canonicalize(&extract_dir).await?;
let mut zip_reader = zip_reader;
for (index, name) in &entries {
let target = extract_dir.join(name);
if !override_conflicts && target.exists() {
continue;
}
if let Some(parent) = target.parent() {
tokio::fs::create_dir_all(parent).await?;
let canonical_parent = tokio::fs::canonicalize(parent).await?;
if !canonical_parent.starts_with(&canonical_extract_dir) {
continue;
}
}
let mut file_bytes = Vec::new();
let mut entry_reader =
zip_reader.reader_with_entry(*index).await.map_err(|e| {
theseus::Error::from(theseus::ErrorKind::OtherError(format!(
"Failed to read zip entry: {e}"
)))
})?;
entry_reader
.read_to_end_checked(&mut file_bytes)
.await
.map_err(|e| {
theseus::Error::from(theseus::ErrorKind::OtherError(format!(
"Failed to extract zip entry: {e}"
)))
})?;
tokio::fs::write(&target, &file_bytes).await?;
}
Ok(None)
}
#[tauri::command]
pub async fn file_save_as<R: Runtime>(
app: tauri::AppHandle<R>,
instance_path: &str,
file_path: &str,
) -> Result<()> {
let base = get_full_path(instance_path).await?;
let source = base.join(file_path);
let file_name = source
.file_name()
.unwrap_or_default()
.to_string_lossy()
.to_string();
let (tx, rx) = tokio::sync::oneshot::channel();
app.dialog()
.file()
.set_file_name(&file_name)
.save_file(|path| {
let _ = tx.send(path);
});
if let Some(dest) = rx.await.unwrap_or(None) {
let dest_path = std::path::PathBuf::try_from(dest).map_err(|e| {
theseus::Error::from(theseus::ErrorKind::OtherError(format!(
"Invalid save path: {e}"
)))
})?;
tokio::fs::copy(&source, &dest_path).await?;
}
Ok(())
}
-1
View File
@@ -19,7 +19,6 @@ pub mod utils;
pub mod ads;
pub mod cache;
pub mod files;
pub mod friends;
pub mod worlds;
+4 -12
View File
@@ -151,20 +151,12 @@ pub async fn add_server_to_profile(
name: String,
address: String,
pack_status: ServerPackStatus,
project_id: Option<String>,
content_kind: Option<String>,
) -> Result<usize> {
let full_path = get_full_path(path).await?;
Ok(worlds::add_server_to_profile(
&full_path,
path,
name,
address,
pack_status,
project_id,
content_kind,
let path = get_full_path(path).await?;
Ok(
worlds::add_server_to_profile(&path, name, address, pack_status)
.await?,
)
.await?)
}
#[tauri::command]
-2
View File
@@ -152,7 +152,6 @@ fn main() {
.plugin(tauri_plugin_os::init())
.plugin(tauri_plugin_dialog::init())
.plugin(tauri_plugin_deep_link::init())
.plugin(tauri_plugin_fs::init())
.plugin(tauri_plugin_opener::init())
.plugin(
tauri_plugin_window_state::Builder::default()
@@ -230,7 +229,6 @@ fn main() {
.plugin(api::tags::init())
.plugin(api::utils::init())
.plugin(api::cache::init())
.plugin(api::files::init())
.plugin(api::ads::init())
.plugin(api::friends::init())
.plugin(api::worlds::init())
-2
View File
@@ -33,8 +33,6 @@ pub enum ErrorKind {
Tracing(#[from] tracing::subscriber::SetGlobalDefaultError),
#[error("Zip error: {0}")]
Zip(#[from] async_zip::error::ZipError),
#[error("Failed to parse an integer: {0}")]
ParseIntError(#[from] std::num::ParseIntError),
}
#[derive(Debug)]
+12 -32
View File
@@ -114,12 +114,12 @@ pub async fn fetch_neo(
}
let forge_versions = fetch_xml::<Metadata>(
"https://maven.neoforged.net/releases/net/neoforged/forge/maven-metadata.xml",
"https://maven.neoforged.net/net/neoforged/forge/maven-metadata.xml",
&semaphore,
)
.await?;
let neo_versions = fetch_xml::<Metadata>(
"https://maven.neoforged.net/releases/net/neoforged/neoforge/maven-metadata.xml",
"https://maven.neoforged.net/net/neoforged/neoforge/maven-metadata.xml",
&semaphore,
)
.await?;
@@ -133,7 +133,7 @@ pub async fn fetch_neo(
Ok(ForgeVersion {
format_version: 2,
installer_url: format!("https://maven.neoforged.net/releases/net/neoforged/forge/{loader_version}/forge-{loader_version}-installer.jar"),
installer_url: format!("https://maven.neoforged.net/net/neoforged/forge/{loader_version}/forge-{loader_version}-installer.jar"),
raw: loader_version,
loader_version: version_split,
game_version: "1.20.1".to_string(), // All NeoForge Forge versions are for 1.20.1
@@ -141,16 +141,9 @@ pub async fn fetch_neo(
}).chain(neo_versions.versioning.versions.version.into_iter().map(|loader_version| {
let mut parts = loader_version.split('.');
// NeoForge Forge versions are in either of these formats:
// - 20.2.29-beta, 20.6.119
// - 26.1.0.10-beta, 26.1.0.16
//
// The first format is the "modern" format for Minecraft versions starting with 1, where the first number is the major MC version,
// the second is the minor MC version, and the third is the NeoForge version.
//
// The second format is the "new-modern" format for Minecraft versions in year-based format, where the first three numbers
// are the Minecraft version (year.release.hotfix), and the fourth, the NeoForge release version, with an optional "beta" suffix.
let major_or_year = parts.next().ok_or_else(
// NeoForge Forge versions are in this format: 20.2.29-beta, 20.6.119
// Where the first number is the major MC version, the second is the minor MC version, and the third is the NeoForge version
let major = parts.next().ok_or_else(
|| crate::ErrorKind::InvalidInput(format!("Unable to find major game version for NeoForge {loader_version}"))
)?;
@@ -158,28 +151,15 @@ pub async fn fetch_neo(
|| crate::ErrorKind::InvalidInput(format!("Unable to find minor game version for NeoForge {loader_version}"))
)?;
let major_or_year = major_or_year.parse::<u32>()?;
// Year-based MC versions started in 2026
let game_version = match major_or_year {
26.. => {
let hotfix = parts.next().ok_or_else(
|| crate::ErrorKind::InvalidInput(format!("Unable to find hotfix version for NeoForge {loader_version}"))
)?;
if hotfix == "0" {
format!("{major_or_year}.{minor}")
} else {
format!("{major_or_year}.{minor}.{hotfix}")
}
}
..26 if minor == "0" => format!("1.{major_or_year}"),
..26 => format!("1.{major_or_year}.{minor}"),
};
let game_version = if minor == "0" {
format!("1.{major}")
} else {
format!("1.{major}.{minor}")
};
Ok(ForgeVersion {
format_version: 2,
installer_url: format!("https://maven.neoforged.net/releases/net/neoforged/neoforge/{loader_version}/neoforge-{loader_version}-installer.jar"),
installer_url: format!("https://maven.neoforged.net/net/neoforged/neoforge/{loader_version}/neoforge-{loader_version}-installer.jar"),
loader_version: loader_version.clone(),
raw: loader_version,
game_version,
@@ -446,6 +446,13 @@ textarea {
}
}
button,
input[type='button'] {
cursor: pointer;
border: none;
outline: 2px solid transparent;
}
kbd {
background-color: var(--color-code-bg);
color: var(--color-code-text);
@@ -2,11 +2,11 @@
<nav
v-if="filteredLinks.length > 1"
ref="scrollContainer"
class="relative flex w-fit overflow-x-auto rounded-full bg-bg-raised p-1 text-sm font-bold"
:class="{ 'shadow-sm': mode === 'navigation' }"
class="experimental-styles-within relative flex w-fit overflow-x-auto rounded-full bg-bg-raised p-1 text-sm font-bold"
:class="{ 'card-shadow': mode === 'navigation' }"
>
<template v-if="mode === 'navigation'">
<RouterLink
<NuxtLink
v-for="(link, index) in filteredLinks"
v-show="link.shown ?? true"
:key="link.href"
@@ -22,7 +22,7 @@
<span class="text-nowrap" :class="getLabelClasses(index)">
{{ link.label }}
</span>
</RouterLink>
</NuxtLink>
</template>
<template v-else>
@@ -57,10 +57,9 @@
<script setup lang="ts">
import type { Component } from 'vue'
import { computed, nextTick, onMounted, ref, watch } from 'vue'
import { RouterLink, useRoute } from 'vue-router'
import { computed, onMounted, ref, watch } from 'vue'
const route = useRoute()
const route = useNativeRoute()
interface Tab {
label: string
@@ -105,8 +104,8 @@ const currentActiveIndex = ref(-1)
const subpageSelected = ref(false)
// SSR state
const sliderReady = ref(false)
const transitionsEnabled = ref(false)
const sliderReady = ref(false) // Slider is positioned and should be visible
const transitionsEnabled = ref(false) // CSS transitions should apply (after first paint)
// Stagger delays for the trailing edges of the slider animation
const sliderDelays = ref({ left: '0ms', top: '0ms', right: '0ms', bottom: '0ms' })
@@ -166,8 +165,8 @@ function computeActiveIndex(): { index: number; isSubpage: boolean } {
for (let i = filteredLinks.value.length - 1; i >= 0; i--) {
const link = filteredLinks.value[i]
const decodedPath = decodeURIComponent(route.path)
const decodedHref = decodeURIComponent(link.href.split('?')[0])
// Query-based matching
if (props.query) {
const queryValue = route.query[props.query]
if (queryValue === link.href || (!queryValue && !link.href)) {
@@ -176,13 +175,14 @@ function computeActiveIndex(): { index: number; isSubpage: boolean } {
continue
}
if (decodedPath === decodedHref) {
// Exact path match
if (decodedPath === link.href) {
return { index: i, isSubpage: false }
}
// Subpage match
const isSubpageMatch =
(decodedPath.startsWith(decodedHref) &&
(decodedPath.length === decodedHref.length || decodedPath[decodedHref.length] === '/')) ||
decodedPath.includes(link.href) ||
link.subpages?.some((subpage) => decodedPath.includes(subpage))
if (isSubpageMatch) {
@@ -204,6 +204,9 @@ function getTabElement(index: number): HTMLElement | null {
if (!element) return null
// In navigation mode, elements are NuxtLinks, but since we used querySelectorAll,
// we already have the raw HTMLElement ($el), so no further conversion is needed.
// In local mode, elements are already plain divs.
return element
}
@@ -222,6 +225,7 @@ function positionSlider() {
const isInitialPosition = sliderLeft.value === 4 && sliderRight.value === 4
if (isInitialPosition) {
// Initial positioning: set position instantly, no animation
sliderLeft.value = newPosition.left
sliderRight.value = newPosition.right
sliderTop.value = newPosition.top
@@ -229,6 +233,7 @@ function positionSlider() {
sliderReady.value = true
// enable transitions after slider is painted, so future changes animate
requestAnimationFrame(() => {
transitionsEnabled.value = true
})
@@ -245,6 +250,7 @@ function animateSliderTo(newPosition: {
}) {
const STAGGER_DELAY = '200ms'
// Set stagger delays: leading edge moves immediately, trailing edge is delayed
sliderDelays.value = {
left: newPosition.left < sliderLeft.value ? '0ms' : STAGGER_DELAY,
right: newPosition.left < sliderLeft.value ? STAGGER_DELAY : '0ms',
@@ -315,4 +321,8 @@ watch(
bottom 150ms cubic-bezier(0.4, 0, 0.2, 1) v-bind(bottomDelay),
opacity 250ms cubic-bezier(0.5, 0, 0.2, 1) 50ms;
}
.card-shadow {
box-shadow: var(--shadow-card);
}
</style>
@@ -30,7 +30,6 @@ import {
type OverflowMenuOption,
useFormatDateTime,
} from '@modrinth/ui'
import { NavTabs } from '@modrinth/ui'
import {
capitalizeString,
formatProjectType,
@@ -42,6 +41,7 @@ import dayjs from 'dayjs'
import { computed, reactive, ref, watch } from 'vue'
import type { UnsafeFile } from '~/components/ui/moderation/MaliciousSummaryModal.vue'
import NavTabs from '~/components/ui/NavTabs.vue'
import ThreadView from '~/components/ui/thread/ThreadView.vue'
const auth = await useAuth()
@@ -51,14 +51,14 @@
</NewModal>
<div class="flex flex-row items-center gap-2 rounded-lg">
<ButtonStyled v-if="isInstalling" type="standard" color="brand" size="large">
<ButtonStyled v-if="isInstalling" type="standard" color="brand">
<button disabled class="flex-shrink-0">
<PanelSpinner class="size-5" /> Installing...
</button>
</ButtonStyled>
<template v-else>
<ButtonStyled v-if="showStopButton" type="transparent" size="large">
<ButtonStyled v-if="showStopButton" type="transparent">
<button :disabled="!canTakeAction" @click="initiateAction('Stop')">
<div class="flex gap-1">
<StopCircleIcon class="h-5 w-5" />
@@ -67,7 +67,7 @@
</button>
</ButtonStyled>
<ButtonStyled type="standard" color="brand" size="large">
<ButtonStyled type="standard" color="brand">
<button v-tooltip="busyReason" :disabled="!canTakeAction" @click="handlePrimaryAction">
<div v-if="isTransitionState" class="grid place-content-center">
<LoadingIcon />
@@ -77,7 +77,7 @@
</button>
</ButtonStyled>
<ButtonStyled circular type="transparent" size="large">
<ButtonStyled circular type="transparent">
<TeleportOverflowMenu :options="[...menuOptions]">
<MoreVerticalIcon aria-hidden="true" />
<template #kill>
@@ -3,7 +3,7 @@
<div
v-if="props.isVisible"
data-pyro-save-banner
class="fixed bottom-16 left-0 right-0 z-[10] mx-auto h-fit w-full max-w-4xl transition-all duration-300 sm:bottom-8"
class="fixed bottom-16 left-0 right-0 z-[6] mx-auto h-fit w-full max-w-4xl transition-all duration-300 sm:bottom-8"
>
<div class="mx-2 rounded-2xl border-2 border-solid border-button-border bg-bg-raised p-4">
<div class="flex flex-col items-center justify-between gap-2 md:flex-row">
@@ -38,7 +38,6 @@ export const DEFAULT_FEATURE_FLAGS = validateValues({
showProjectPageQuickServerButton: false,
newProjectGeneralSettings: false,
newProjectEnvironmentSettings: true,
archonSentryCapture: false,
hideRussiaCensorshipBanner: false,
disablePrettyProjectUrlRedirects: false,
hidePreviewBanner: false,
-4
View File
@@ -13,8 +13,6 @@ import {
} from '@modrinth/api-client'
import type { Ref } from 'vue'
import { useFeatureFlags } from '~/composables/featureFlags.ts'
async function getRateLimitKeyFromSecretsStore(): Promise<string | undefined> {
try {
const mod = 'cloudflare:workers'
@@ -30,7 +28,6 @@ export function createModrinthClient(
auth: Ref<{ token: string | undefined }>,
config: { apiBaseUrl: string; archonBaseUrl: string; rateLimitKey?: string },
): NuxtModrinthClient {
const flags = useFeatureFlags()
const optionalFeatures = [
import.meta.dev ? (new VerboseLoggingFeature() as AbstractFeature) : undefined,
].filter(Boolean) as AbstractFeature[]
@@ -38,7 +35,6 @@ export function createModrinthClient(
const clientConfig: NuxtClientConfig = {
labrinthBaseUrl: config.apiBaseUrl,
archonBaseUrl: config.archonBaseUrl,
archonSentryCapture: () => flags.value.archonSentryCapture,
rateLimitKey: config.rateLimitKey || getRateLimitKeyFromSecretsStore,
features: [
// for modrinth hosting
+9 -8
View File
@@ -473,8 +473,7 @@
<SettingsIcon aria-hidden="true" /> {{ formatMessage(commonMessages.settingsLabel) }}
</template>
<template #flags>
<ToggleRightIcon aria-hidden="true" />
{{ formatMessage(commonSettingsMessages.featureFlags) }}
<ReportIcon aria-hidden="true" /> {{ formatMessage(messages.featureFlags) }}
</template>
<template #projects>
<BoxIcon aria-hidden="true" /> {{ formatMessage(messages.projects) }}
@@ -586,9 +585,9 @@
<ScaleIcon aria-hidden="true" />
{{ formatMessage(commonMessages.moderationLabel) }}
</NuxtLink>
<NuxtLink v-if="flags.developerMode" class="iconified-button" to="/settings/flags">
<ToggleRightIcon aria-hidden="true" />
{{ formatMessage(commonSettingsMessages.featureFlags) }}
<NuxtLink v-if="flags.developerMode" class="iconified-button" to="/flags">
<ReportIcon aria-hidden="true" />
{{ formatMessage(messages.featureFlags) }}
</NuxtLink>
</template>
<NuxtLink class="iconified-button" to="/settings">
@@ -725,7 +724,6 @@ import {
SettingsIcon,
ShieldAlertIcon,
SunIcon,
ToggleRightIcon,
TransferIcon,
UserIcon,
UserSearchIcon,
@@ -736,7 +734,6 @@ import {
ButtonStyled,
commonMessages,
commonProjectTypeCategoryMessages,
commonSettingsMessages,
defineMessages,
injectModrinthClient,
OverflowMenu,
@@ -921,6 +918,10 @@ const messages = defineMessages({
id: 'layout.nav.upgrade-to-modrinth-plus',
defaultMessage: 'Upgrade to Modrinth+',
},
featureFlags: {
id: 'layout.nav.feature-flags',
defaultMessage: 'Feature flags',
},
projects: {
id: 'layout.nav.projects',
defaultMessage: 'Projects',
@@ -1044,7 +1045,7 @@ const userMenuOptions = computed(() => {
},
{
id: 'flags',
link: '/settings/flags',
link: '/flags',
shown: flags.value.developerMode,
},
{
@@ -38,9 +38,6 @@
"app-marketing.download.options-title": {
"message": "خيارات التنزيل"
},
"app-marketing.download.terms": {
"message": "بتنزيلك Modrinth App فإنك توافق على <terms-link>الشروط</terms-link> و <privacy-link>سياسة الخصوصية</privacy-link>."
},
"app-marketing.download.title": {
"message": "تنزيل Modrinth App (النسخة التجريبية)"
},
@@ -107,9 +104,6 @@
"app-marketing.features.performance.cpu-percent": {
"message": "% CPU"
},
"app-marketing.features.performance.description": {
"message": "يعمل Modrinth App بكفاءة أفضل من العديد من مديري المودات الرائدين، باستخدام 150 ميغابايت فقط من الذاكرة العشوائية!"
},
"app-marketing.features.performance.discord": {
"message": "ديسكورد"
},
@@ -392,9 +386,6 @@
"collection.label.no-projects": {
"message": "لا توجد مشروعات في هذه المجموعة حتي الآن"
},
"collection.label.projects-count": {
"message": "{count, plural, =0 {لا مشاريع حتى الاۤن} other {<stat>{count}</stat> {type}}}"
},
"collection.label.updated-at": {
"message": "تم التحديث منذ {ago}"
},
@@ -497,24 +488,12 @@
"create.project.create-project": {
"message": "إنشاء مشروع"
},
"create.project.missing-fields-tooltip": {
"message": "حقل مفقود: {fields}"
},
"create.project.name-label": {
"message": "الإسم"
},
"create.project.name-placeholder": {
"message": "أدخل اسم المشروع..."
},
"create.project.owner-description": {
"message": "عين مالك المشروع كنفسك أو كمنظمة أنت عضو منها."
},
"create.project.owner-label": {
"message": "المالك"
},
"create.project.server-project-title": {
"message": "إنشاء مشروع الخادم"
},
"create.project.summary-description": {
"message": "جملة أو جملتان تصف مجموعتك."
},
@@ -527,15 +506,6 @@
"create.project.title": {
"message": "إنشاء مشروع"
},
"create.project.type-label": {
"message": "نوع"
},
"create.project.type-project": {
"message": "مشروع"
},
"create.project.type-server": {
"message": "خادم"
},
"create.project.url-label": {
"message": "عنوان URL"
},
@@ -575,21 +545,6 @@
"dashboard.collections.button.create-new": {
"message": "إنشاء جديد"
},
"dashboard.collections.empty.get-started-hint": {
"message": "أنشئ مجموعتك الأولى للبدء!"
},
"dashboard.collections.empty.no-collections": {
"message": "ليس لديك مجموعات بعد"
},
"dashboard.collections.empty.no-match": {
"message": "لا توجد مجموعات تطابق بحثك"
},
"dashboard.collections.empty.no-match-hint": {
"message": "جرب تعديل فلاترك أو شروط البحث."
},
"dashboard.collections.label.projects-count": {
"message": "{count} {countPlural, plural, one {مشروع} other {مشروع}}"
},
"dashboard.collections.label.search-input": {
"message": "ابحث في مجموعاتك"
},
@@ -665,9 +620,6 @@
"dashboard.creator-withdraw-modal.kyc.entity-description": {
"message": "تشير الكيان التجاري إلى منظمة مسجلة مثل شركة مساهمة أو شراكة أو شركة ذات مسؤولية محدودة."
},
"dashboard.creator-withdraw-modal.kyc.entity-question": {
"message": "هل تسحب كفرد أم كشركة؟"
},
"dashboard.creator-withdraw-modal.kyc.private-individual": {
"message": "فرد خاص"
},
@@ -1094,57 +1046,15 @@
"frog": {
"message": "لقد تم ضفدعتك! 🐸"
},
"frog.altText": {
"message": "لوحة فنية واقعية فوتوغرافية لمتاهة ضفادع"
},
"frog.title": {
"message": "ضفدع"
},
"hosting-marketing.available-locations": {
"message": "متاح في أمريكا الشمالية، أوروبا، و جنوب شرق اۤسيا لتغطية أوسع."
},
"hosting-marketing.billing.monthly": {
"message": "ادفع شهريا"
},
"hosting-marketing.billing.quarterly": {
"message": "ادفع أرباعا سنوية"
},
"hosting-marketing.billing.save-with-quarterly": {
"message": "وفر 16% مع الدفع ربع السنوي!"
},
"hosting-marketing.billing.starting-at": {
"message": "يبدأ من {price} / للشهر"
},
"hosting-marketing.billing.yearly": {
"message": "ادفع سنويا"
},
"hosting-marketing.faq.burst-threads": {
"message": "كيف تعمل مسارات المعالجة في وحدة المعالجة المركزية؟"
},
"hosting-marketing.faq.cpu-kind.answer": {
"message": "تعمل استضافة خوادم مودرينث على AMD Ryzen 7900 و 7950X3D و وحدات معالجة مركزية مماثلة بسرعة 5+ غيغاهيرتز مقترنة بذاكرة وصول عشوائي من نوع DDR5"
},
"hosting-marketing.faq.location": {
"message": "أين تقع استضافة خوادم Modrinth؟ هل يمكنني اختيار منطقة؟"
},
"hosting-marketing.get-started": {
"message": "ابدأ"
},
"hosting-marketing.hero.button.manage-your-servers": {
"message": "ٳدارة خوادمك"
},
"hosting-marketing.hero.button.start-a-new-server": {
"message": "أنشئ خادما جديدا"
},
"hosting-marketing.hero.button.start-your-server": {
"message": "أنشئ خادمك"
},
"hosting-marketing.hero.host-with-modrinth": {
"message": "أدر خادمك التالي مع Modrinth Hosting"
},
"hosting-marketing.included.backups-included": {
"message": "النسخ الاحتياطية مضمنة"
},
"hosting-marketing.included.description": {
"message": "."
},
@@ -536,9 +536,6 @@
"dashboard.affiliate-links.revoke-confirm.button": {
"message": "Odvolat"
},
"dashboard.affiliate-links.revoke-confirm.title": {
"message": "Jste si jistý, že chcete zrušit svůj affiliate odkaz „{title}“?"
},
"dashboard.collections.button.create-new": {
"message": "Vytvořit novou"
},
@@ -1460,6 +1460,9 @@
"layout.nav.discover-content": {
"message": "Opdag indhold"
},
"layout.nav.feature-flags": {
"message": "Funktionsflags"
},
"layout.nav.get-modrinth-app": {
"message": "Hent Modrinth-app"
},
+3 -21
View File
@@ -1313,9 +1313,6 @@
"hosting.loader.failed-to-repair": {
"message": "Reparatur des Servers fehlgeschlagen"
},
"hosting.loader.failed-to-reset-to-onboarding": {
"message": "Server konnte nicht in den Onboarding-Zustand zurückgesetzt werden"
},
"hosting.loader.failed-to-save-settings": {
"message": "Speichern der Installationseinstellungen fehlgeschlagen"
},
@@ -1337,24 +1334,6 @@
"hosting.loader.reset-server-description": {
"message": "Entfernt sämtliche daten von deinem Server, inklusive deiner Welten, Mods und Konfigurationsdateien. Sicherung bleiben und können wiederhergestellt werden."
},
"hosting.loader.reset-to-onboarding-button": {
"message": "Auf Onboarding zurücksetzen"
},
"hosting.loader.reset-to-onboarding-modal-description": {
"message": "Dadurch wird der Server in den Onboarding-Zustand zurückgesetzt, sodass die Einrichtung erneut abgeschlossen werden kann. Möchtest du wirklich fortfahren?"
},
"hosting.loader.reset-to-onboarding-modal-title": {
"message": "Auf Onboarding zurücksetzen"
},
"hosting.loader.reset-to-onboarding-success-description": {
"message": "Der Server wurde in den Onboarding-Ablauf zurückgesetzt."
},
"hosting.loader.reset-to-onboarding-success-title": {
"message": "Server auf Onboarding zurückgesetzt"
},
"hosting.loader.support-options-title": {
"message": "Supportoptionen"
},
"hosting.plan.out-of-stock": {
"message": "Nicht verfügbar"
},
@@ -1709,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Inhalte entdecken"
},
"layout.nav.feature-flags": {
"message": "Funktionsflags"
},
"layout.nav.get-modrinth-app": {
"message": "Modrinth App herunterladen"
},
+3 -21
View File
@@ -1313,9 +1313,6 @@
"hosting.loader.failed-to-repair": {
"message": "Reparatur des Servers fehlgeschlagen"
},
"hosting.loader.failed-to-reset-to-onboarding": {
"message": "Server konnte nicht in den Onboarding-Zustand zurückgesetzt werden"
},
"hosting.loader.failed-to-save-settings": {
"message": "Speichern der Installationseinstellungen ist fehlgeschlagen"
},
@@ -1337,24 +1334,6 @@
"hosting.loader.reset-server-description": {
"message": "Entfernt alle Daten auf deinem Server, einschließlich deiner Welten, Mods und Konfigurationsdateien. Die Sicherungen bleiben erhalten und können wiederhergestellt werden."
},
"hosting.loader.reset-to-onboarding-button": {
"message": "Auf Onboarding zurücksetzen"
},
"hosting.loader.reset-to-onboarding-modal-description": {
"message": "Dadurch wird der Server in den Onboarding-Zustand zurückgesetzt, sodass die Einrichtung erneut abgeschlossen werden kann. Möchtest du wirklich fortfahren?"
},
"hosting.loader.reset-to-onboarding-modal-title": {
"message": "Auf Onboarding zurücksetzen"
},
"hosting.loader.reset-to-onboarding-success-description": {
"message": "Der Server wurde in den Onboarding-Ablauf zurückgesetzt."
},
"hosting.loader.reset-to-onboarding-success-title": {
"message": "Server auf Onboarding zurückgesetzt"
},
"hosting.loader.support-options-title": {
"message": "Supportoptionen"
},
"hosting.plan.out-of-stock": {
"message": "Nicht verfügbar"
},
@@ -1709,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Inhalte entdecken"
},
"layout.nav.feature-flags": {
"message": "Funktionsflags"
},
"layout.nav.get-modrinth-app": {
"message": "Modrinth App herunterladen"
},
+3 -21
View File
@@ -1313,9 +1313,6 @@
"hosting.loader.failed-to-repair": {
"message": "Failed to repair server"
},
"hosting.loader.failed-to-reset-to-onboarding": {
"message": "Failed to reset server to onboarding"
},
"hosting.loader.failed-to-save-settings": {
"message": "Failed to save installation settings"
},
@@ -1337,24 +1334,6 @@
"hosting.loader.reset-server-description": {
"message": "Removes all data on your server, including your worlds, mods, and configuration files. Backups will remain and can be restored."
},
"hosting.loader.reset-to-onboarding-button": {
"message": "Reset to onboarding"
},
"hosting.loader.reset-to-onboarding-modal-description": {
"message": "This will send the server back into onboarding so setup can be completed again. Are you sure you want to continue?"
},
"hosting.loader.reset-to-onboarding-modal-title": {
"message": "Reset to onboarding"
},
"hosting.loader.reset-to-onboarding-success-description": {
"message": "The server has been returned to the onboarding flow."
},
"hosting.loader.reset-to-onboarding-success-title": {
"message": "Server reset to onboarding"
},
"hosting.loader.support-options-title": {
"message": "Support options"
},
"hosting.plan.out-of-stock": {
"message": "Out of stock"
},
@@ -1709,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Discover content"
},
"layout.nav.feature-flags": {
"message": "Feature flags"
},
"layout.nav.get-modrinth-app": {
"message": "Get Modrinth App"
},
+18 -15
View File
@@ -39,7 +39,7 @@
"message": "Opciones de descarga"
},
"app-marketing.download.terms": {
"message": "Al descargar la aplicación Modrinth, acepta nuestros <terms-link>Términos</terms-link> y <privacy-link>Política de privacidad</privacy-link>."
"message": "Al descargar Modrinth App, tú aceptas nuestros <terms-link>Términos</terms-link> y <privacy-link>Política de privacidad</privacy-link>."
},
"app-marketing.download.title": {
"message": "Descargar la Modrinth App (Beta)"
@@ -108,7 +108,7 @@
"message": "% CPU"
},
"app-marketing.features.performance.description": {
"message": "Modrinth App performs better than many of the leading mod managers, using just 150 MB of RAM!"
"message": "La aplicación Modrinth funciona mejor que muchos de los principales gestores de mods, ¡usando solo 150 MB de RAM!"
},
"app-marketing.features.performance.discord": {
"message": "Discord"
@@ -393,7 +393,7 @@
"message": "Aún no hay proyectos en la colección"
},
"collection.label.projects-count": {
"message": "{count, plural, =0 {No hay proyectos todavía} otros {<stat>{count}</stat> {type}}}"
"message": "{count, plural, =0 {Aún no hay proyectos} other {<stat>{count}</stat> {type}}}"
},
"collection.label.updated-at": {
"message": "Actualizado {ago}"
@@ -576,7 +576,7 @@
"message": "Crear nuevo"
},
"dashboard.collections.empty.get-started-hint": {
"message": "Crea tu primera colección para comenzar!"
"message": "¡Crea tu primera colección para comenzar!"
},
"dashboard.collections.empty.no-collections": {
"message": "Aún no tienes ninguna colección"
@@ -585,10 +585,10 @@
"message": "Ninguna colección coincide con tu búsqueda"
},
"dashboard.collections.empty.no-match-hint": {
"message": "Prueba a ajustar tus filtros o términos de búsqueda."
"message": "Intente ajustar sus filtros o términos de búsqueda."
},
"dashboard.collections.label.projects-count": {
"message": "{count} {countPlural, plural, one {project} other {projects}}"
"message": "{count} {countPlural, plural, one {proyecto} other {proyectos}}"
},
"dashboard.collections.label.search-input": {
"message": "Busca en tus colecciones"
@@ -666,7 +666,7 @@
"message": "Una entidad comercial se refiere a una organización registrada, como una sociedad anónima, una sociedad colectiva o una sociedad de responsabilidad limitada."
},
"dashboard.creator-withdraw-modal.kyc.entity-question": {
"message": "¿Te vas a retirar como individuo o como empresa?"
"message": "¿Vas a realizar la retirada como particular o como empresa?"
},
"dashboard.creator-withdraw-modal.kyc.private-individual": {
"message": "Particular"
@@ -1248,7 +1248,7 @@
"message": "¿Sabes exactamente lo que necesitas?"
},
"hosting-marketing.medal.info": {
"message": "Pruebe un <orange>servidor de 3 GB</orange> gratis durante 5 días con la tecnología <orange>Medal</orange>"
"message": "Pruebe un <orange>servidor de 3 GB</orange> gratuito durante 5 días con <orange>Medal</orange>"
},
"hosting-marketing.medal.learn-more": {
"message": "Aprender más"
@@ -1305,7 +1305,7 @@
"message": "No se pudo cambiar la versión del modpack"
},
"hosting.loader.failed-to-load-versions": {
"message": "No se pudo cargar las versiones"
"message": "No se pudieron cargar las versiones"
},
"hosting.loader.failed-to-reinstall": {
"message": "No se pudo reinstalar el modpack"
@@ -1314,25 +1314,25 @@
"message": "No se pudo reparar el servidor"
},
"hosting.loader.failed-to-save-settings": {
"message": "No se pudo guardar la configuración de la instalación"
"message": "No se pudo guardar la configuración de instalación"
},
"hosting.loader.failed-to-unlink": {
"message": "No se pudo desvincular el modpack"
},
"hosting.loader.loader-version": {
"message": "{loader, select, null {Loader} otra versión {{loader}}}"
"message": "{loader, select, null {Cargador} other {{loader}}} versión"
},
"hosting.loader.repair-started-text": {
"message": "La instalación de tu servidor ha sido reparada."
"message": "La instalación de su servidor ha sido reparada."
},
"hosting.loader.repair-started-title": {
"message": "Reparación completada"
},
"hosting.loader.reset-server": {
"message": "Resetear server"
"message": "Reiniciar servidor"
},
"hosting.loader.reset-server-description": {
"message": "Elimina todos los datos de tu servidor, incluidos tus mundos, mods y archivos de configuración. Los backups se mantendrán y podrán restaurarse."
"message": "Elimina todos los datos de su servidor, incluidos sus mundos, mods y archivos de configuración. Las copias de seguridad permanecerán y podrán restaurarse."
},
"hosting.plan.out-of-stock": {
"message": "Agotado"
@@ -1467,7 +1467,7 @@
"message": "Para jugadores"
},
"landing.section.for-players.tagline": {
"message": "Descubre sobre las creaciones de {count, number}"
"message": "Descubra más de {count, number} creaciones"
},
"landing.subheading": {
"message": "Descubre, juega y comparte contenido de Minecraft a través de nuestra plataforma de código abierto creada para la comunidad."
@@ -1688,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Descubrir contenido"
},
"layout.nav.feature-flags": {
"message": "Funciones experimentales"
},
"layout.nav.get-modrinth-app": {
"message": "Obtener la Modrinth App"
},
@@ -1688,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Descubra el contenido"
},
"layout.nav.feature-flags": {
"message": "Banderas de características"
},
"layout.nav.get-modrinth-app": {
"message": "Descargar la aplicación Modrinth"
},
@@ -143,9 +143,6 @@
"app-marketing.features.performance.title": {
"message": "Suorituskykyinen"
},
"app-marketing.features.play.description": {
"message": "Käytä Modrinth sovellusta asentaaksesi ja pelataksesi sinun suosikki modeliila ja modpackeilla."
},
"app-marketing.features.play.title": {
"message": "Pelaa lempi modeillasi"
},
@@ -335,9 +332,6 @@
"collection.label.created-at": {
"message": "Luotu {ago}"
},
"collection.label.projects-count": {
"message": "{count, plural, =0 {No projects yet} other {<stat>{count}</stat> {type}}}"
},
"collection.label.updated-at": {
"message": "Päivitetty {ago}"
},
@@ -1658,6 +1658,9 @@
"layout.nav.discover-content": {
"message": "Tumuklas ng kontento"
},
"layout.nav.feature-flags": {
"message": "Mga hudyat ng tampok"
},
"layout.nav.get-modrinth-app": {
"message": "Kunin ang Modrinth App"
},
+3 -21
View File
@@ -1313,9 +1313,6 @@
"hosting.loader.failed-to-repair": {
"message": "Impossible de réparer le serveur"
},
"hosting.loader.failed-to-reset-to-onboarding": {
"message": "Impossible de réinitialiser le serveur à l'intégration"
},
"hosting.loader.failed-to-save-settings": {
"message": "Impossible de sauvegarder les paramètres d'installation"
},
@@ -1337,24 +1334,6 @@
"hosting.loader.reset-server-description": {
"message": "Supprime définitivement toutes les données de votre serveur, y compris vos mondes, vos mods, et vos fichiers paramètres. Les sauvegardes resteront et pourront être restaurées."
},
"hosting.loader.reset-to-onboarding-button": {
"message": "Réinitialiser à l'intégration"
},
"hosting.loader.reset-to-onboarding-modal-description": {
"message": "Cela enverra le serveur à l'intégration afin que la configuration puisse être terminée à nouveau. Êtes-vous sûr de vouloir continuer ?"
},
"hosting.loader.reset-to-onboarding-modal-title": {
"message": "Réinitialiser à l'intégration"
},
"hosting.loader.reset-to-onboarding-success-description": {
"message": "Le serveur a été renvoyé au flux d'intégration."
},
"hosting.loader.reset-to-onboarding-success-title": {
"message": "Serveur réinitialisé à l'intégration"
},
"hosting.loader.support-options-title": {
"message": "Options de prise en charge"
},
"hosting.plan.out-of-stock": {
"message": "En rupture de stock"
},
@@ -1709,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Découvrir du contenu"
},
"layout.nav.feature-flags": {
"message": "Fonctionnalités expérimentales"
},
"layout.nav.get-modrinth-app": {
"message": "Obtenir Modrinth App"
},
@@ -1010,6 +1010,9 @@
"layout.nav.discover-content": {
"message": "גלה תוכן"
},
"layout.nav.feature-flags": {
"message": "הגדרות ניסיוניות"
},
"layout.nav.get-modrinth-app": {
"message": "להוריד אפליקציאת Modrinth"
},
+56 -242
View File
@@ -66,7 +66,7 @@
"message": "Profil importálás"
},
"app-marketing.features.mod-management.actions": {
"message": "Műveletek"
"message": "Akciók"
},
"app-marketing.features.mod-management.byAuthor": {
"message": "{author} által"
@@ -309,10 +309,10 @@
"message": "Az email már hítelesítve van!"
},
"auth.verify-email.already-verified.title": {
"message": "Az e-mail cím már hítelesítve van"
"message": "Email már hítelesítve van"
},
"auth.verify-email.failed-verification.action": {
"message": "Hitelesítő e-mail újraküldése"
"message": "Hítelesítő email újraküldése"
},
"auth.verify-email.failed-verification.description": {
"message": "Nem tudtuk ellenőrizni az e-mail címét. Próbálja meg újra elküldeni az ellenőrző e-mailt a bejelentkezés után a vezérlőpulton keresztül."
@@ -321,16 +321,16 @@
"message": "Nem tudtuk ellenőrizni az e-mail címét. Kérjük, próbálja meg újra elküldeni az ellenőrző e-mailt az alábbi gombra kattintva."
},
"auth.verify-email.failed-verification.title": {
"message": "Az e-mail cím hitelesítés sikertelen"
"message": "Email hítelesítés sikertelen"
},
"auth.verify-email.post-verification.description": {
"message": "Az e-mail cím sikeresen megerősítve!"
"message": "E-mail cím sikeresen megerősítve!"
},
"auth.verify-email.post-verification.title": {
"message": "E-mail cím hitelesítése"
"message": "Email megerősítés"
},
"auth.verify-email.title": {
"message": "Email-cím hitelesítése"
"message": "Email-cím megerősítése"
},
"auth.welcome.checkbox.subscribe": {
"message": "Iratkozzon fel a Modrinth frissítéseiről szóló értesítésekre"
@@ -387,7 +387,7 @@
"message": "Létrehozva {ago}"
},
"collection.label.curated-by": {
"message": "Készítő"
"message": "Kurátor"
},
"collection.label.no-projects": {
"message": "Még nincsenek projektek ebben a gyűjteményben"
@@ -411,7 +411,7 @@
"message": "A kiegészítő fájlok olyan kiegészítő forrásokhoz tartoznak, mint például a forráskód, nem pedig alternatív verziókhoz vagy változatokhoz."
},
"create.collection.collection-info": {
"message": "Az új gyűjteményed nyilvános gyűjteményként jön létre {count, plural, =0 {projektek nélkül} other {# projekttel}}."
"message": "Az új gyűjteményed nyilvános gyűjteményként jön létre, {count, plural, =0 {nincs projekt} one {# projekt} other {# projekt}}."
},
"create.collection.create-collection": {
"message": "Gyűjtemény létrehozása"
@@ -588,7 +588,7 @@
"message": "Próbáld meg módosítani a szűrőket vagy a keresési kifejezéseket."
},
"dashboard.collections.label.projects-count": {
"message": "{count} projekt"
"message": "{count} {countPlural, plural, one {projekt} other {projektek}}"
},
"dashboard.collections.label.search-input": {
"message": "Keresd meg a gyűjteményeidet"
@@ -603,7 +603,7 @@
"message": "A(z) {formType} adóbevallásodat sikeresen elküldtük!"
},
"dashboard.creator-tax-form-modal.confirmation.support-text": {
"message": "Mostantól szabadon felvehetsz a fiókodról. Amennyiben kérdésed van, vagy frissítenéd az adataidat <support-link>vedd fel velünk a kapcsolatot</support-link>."
"message": "Mostantól szabadon kivehetsz a fiókodról. Amennyiben kérdésed van, vagy frissítenéd az adataidat <support-link>vedd fel velünk a kapcsolatot</support-link>."
},
"dashboard.creator-tax-form-modal.confirmation.title": {
"message": "Készen állsz! 🎉"
@@ -624,7 +624,7 @@
"message": "Adóűrlap"
},
"dashboard.creator-tax-form-modal.security.description": {
"message": "A Modrinth a Track1099 nevű harmadik fél szolgáltatót használja az adóűrlapjaid biztonságos begyűjtésére és tárolására. <security-link>További információ.</security-link>"
"message": "A Modrinth a Track1099 nevű harmadik fél szolgáltatót használja az adóűrlapjaid biztonságos begyűjtésére és tárolására. <security-link>További információk itt.</security-link>"
},
"dashboard.creator-tax-form-modal.security.header": {
"message": "Biztonsági gyakorlatok"
@@ -699,7 +699,7 @@
"message": "Fiók tulajdonosa"
},
"dashboard.creator-withdraw-modal.muralpay-details.bank-account-owner": {
"message": "Bankszámla tulajdonosa"
"message": "Bankszámla tulajdonos"
},
"dashboard.creator-withdraw-modal.muralpay-details.bank-account-owner-description": {
"message": "Adja meg annak a személynek a nevét, aki a vállalkozás nevében jogosult a bankszámla kezelésére."
@@ -819,10 +819,10 @@
"message": "Összeg keresése"
},
"dashboard.creator-withdraw-modal.tremendous-details.unverified-email-header": {
"message": "Hitelesítetlen e-mail"
"message": "Megerősítettlen E-mail"
},
"dashboard.creator-withdraw-modal.tremendous-details.unverified-email-message": {
"message": "A kiszállítási e-mail cím, amit megadtál nincs hozzákapcsolva a Modrinth fiókodhoz. A Modrinth nem tudja visszaállítani a jutalmakat, amik rossz e-mail címre lettek küldve."
"message": "A kiszállítási e-mail, amit megadtál nincs hozzákapcsolva a Modrinth fiókodhoz. A Modrinth nem tudja visszaállítani a jutalmakat, amik rossz e-mail címre lettek küldve."
},
"dashboard.creator-withdraw-modal.tremendous-details.usd-paypal-warning-header": {
"message": "Alacsonyabb díjak elérhetőek"
@@ -1064,17 +1064,11 @@
"hosting-marketing.billing.yearly": {
"message": "Éves fizetés"
},
"hosting-marketing.faq.burst-threads": {
"message": "Hogyan működnek a CPU-burst szálak?"
},
"hosting-marketing.faq.burst-threads.answer": {
"message": "Amikor a szervered nagy terhelés alatt áll, ideiglenesen további processzorszálakat biztosítunk számára, hogy csökkentsük a lagtüskéket és az instabilitást. Ez segít megakadályozni, hogy a TPS 20 alá essen, így a játékélmény a lehető legsimább marad.\nMivel ezek az extra processzorszálak csak rövid ideig, nagy terhelés esetén érhetők el, előfordulhat, hogy nem jelennek meg a Spark jelentésekben vagy más teljesítményelemző eszközökben."
},
"hosting-marketing.faq.cpu-kind": {
"message": "Milyen típusú CPU-k futnak a Modrinth Hosting szerverein?"
},
"hosting-marketing.faq.cpu-kind.answer": {
"message": "A Modrinth Hosting szerverei AMD Ryzen 7900 és 7950X3D egyenértékű, 5+ GHz-s processzorokkal és DDR5 memóriával vannak felszerelve."
"message": "A Modrinth Hosting szerverei AMD Ryzen 7900 és 7950X3D egyenértékű, 5+ GHz-s CPU-kkal és DDR5 memóriával vannak felszerelve."
},
"hosting-marketing.faq.currency": {
"message": "Milyen pénznemben vannak megadva az árak?"
@@ -1085,9 +1079,6 @@
"hosting-marketing.faq.ddos-protection": {
"message": "A Modrinth Hosting szerverei rendelkeznek DDoS védelemmel?"
},
"hosting-marketing.faq.ddos-protection.answer": {
"message": "Igen. A Modrinth Hosting összes szerverén DDoS-védelem működik, egyes helyszíneken akár 17 Tbps kapacitással."
},
"hosting-marketing.faq.heading": {
"message": "Gyakori kérdések"
},
@@ -1143,7 +1134,7 @@
"message": "Fejlett hálózatkezelés"
},
"hosting-marketing.included.advanced-networking.description": {
"message": "Add hozzá saját domainedet a szerveredhez, foglalj le akár 15 portot azokhoz a modokhoz, amelyeknek szükségük van rá, és még sok más."
"message": "."
},
"hosting-marketing.included.backups-included": {
"message": "Tartalmaz biztonsági másolatokat"
@@ -1184,18 +1175,12 @@
"hosting-marketing.included.sftp-access": {
"message": "SFTP hozzáférés"
},
"hosting-marketing.included.sftp-access.description": {
"message": "A Modrinth Hosting szolgáltatásba beépített SFTP segítségével közvetlenül elérheti a szerver fájljait."
},
"hosting-marketing.included.with-your-server": {
"message": "A szerverhez tartozik"
},
"hosting-marketing.know-what-you-need": {
"message": "Pontosan tudod, mire van szükséged?"
},
"hosting-marketing.medal.info": {
"message": "Próbálja ki 5 napig ingyen a <orange>3 GB-os szervert</orange>, amelyet a <orange>Medal</orange> biztosít"
},
"hosting-marketing.medal.learn-more": {
"message": "További információk"
},
@@ -1226,11 +1211,8 @@
"hosting-marketing.why.heading": {
"message": "Keress egy modcsomagot. Most már ez egy szerver."
},
"hosting-marketing.why.modern-reliable-hosting": {
"message": "Élvezd a modern, megbízható szerverüzemeltetést"
},
"hosting-marketing.why.modern-reliable-hosting.description": {
"message": "A Modrinth Hosting <contrast>nagy teljesítményű AMD processzorokat és DDR5 memóriát</contrast> használ, valamint egyedi szoftverrel gondoskodik a stabil, zökkenőmentes működésről."
"message": "A Modrinth Hosting szerverei <contrast>nagy teljesítményű AMD CPU-kon és DDR5 RAM-on</contrast> futnak, egyedi fejlesztésű szoftverrel, hogy a szerver zökkenőmentesen működjön."
},
"hosting-marketing.why.where-mods-are": {
"message": "Játssz ott, ahol a modjaid vannak"
@@ -1250,12 +1232,6 @@
"hosting.loader.loader-version": {
"message": "{loader, select,null {Betöltő} other {{loader}}} Verzió"
},
"hosting.loader.reset-server": {
"message": "Szerver visszaállítása"
},
"hosting.loader.reset-server-description": {
"message": "Minden adatot eltávolít a szerverről, beleértve a világokat, a modokat és a konfigurációs fájlokat is. A biztonsági másolatok megmaradnak, és visszaállíthatók."
},
"hosting.plan.select-plan": {
"message": "Csomag kiválasztása"
},
@@ -1269,7 +1245,7 @@
"message": "Kapd meg a legjobb modolási élményt folyamatos frissítésekkel a Modrinth csapattól"
},
"landing.creator.feature.constantly-evolving.title": {
"message": "Folyamatos változás"
"message": "Folyamatos Változás"
},
"landing.creator.feature.data-statistics.description": {
"message": "Részletes jelentéseket kaphatsz a megtekintésekről, a letöltések számáról és a bevételekről."
@@ -1365,7 +1341,7 @@
"message": "Értesítések"
},
"landing.notifications.received-time": {
"message": "{time} kaptad"
"message": "Kaptad {time} óta"
},
"landing.notifications.version-released": {
"message": "Egy új verzió {version} kijött erre: {gameVersion}"
@@ -1401,7 +1377,7 @@
"message": "Fájl keresés"
},
"layout.action.lookup-by-email": {
"message": "Keresés e-mail cím alapján"
"message": "Email alapján keresés"
},
"layout.action.manage-server-notices": {
"message": "Szerver megjegyzések kezelése"
@@ -1568,6 +1544,9 @@
"layout.nav.discover-content": {
"message": "Tartalom felfedezése"
},
"layout.nav.feature-flags": {
"message": "Funkciójelzők"
},
"layout.nav.get-modrinth-app": {
"message": "Szerezd meg a Modrinth Appot"
},
@@ -1866,7 +1845,7 @@
"message": "Nézd át jól a pénztárca címedet. Az egyenleg rossz címre lesz küldve az nem szerezhető vissza."
},
"profile.bio.fallback.creator": {
"message": "Egy Modrinth fejlesztő."
"message": "Egy Modrinth alkotó."
},
"profile.bio.fallback.user": {
"message": "Egy Modrinth felhasználó."
@@ -1893,7 +1872,7 @@
"message": "Auth szolgáltatók"
},
"profile.details.label.email": {
"message": "E-mail"
"message": "Email"
},
"profile.details.label.email-verified": {
"message": "E-mail cím ellenőrizve"
@@ -1911,7 +1890,7 @@
"message": "Nem hitelesített email"
},
"profile.details.tooltip.email-verified": {
"message": "E-mail cím hitelesítve"
"message": "Hitelesített email"
},
"profile.error.not-found": {
"message": "Felhasználó nem található"
@@ -1926,7 +1905,7 @@
"message": "Gyűjtemény"
},
"profile.label.downloads": {
"message": "{count} letöltés"
"message": "{count} {countPlural, plural,one {letöltés} other {letöltések}}"
},
"profile.label.joined": {
"message": "Csatlakozott"
@@ -1947,7 +1926,7 @@
"message": "Szervezetek"
},
"profile.label.projects": {
"message": "{count} projekt"
"message": "{count} {countPlural, plural,one {projekt} other {projektek}}"
},
"profile.label.saving": {
"message": "Mentés..."
@@ -2019,61 +1998,61 @@
"message": "Figyelmeztetés"
},
"project-type.collection.plural": {
"message": "Gyűjtemények"
"message": "Gyűjtemény"
},
"project-type.collection.singular": {
"message": "Gyűjtemény"
},
"project-type.datapack.plural": {
"message": "Adatcsomagok"
"message": "Adatcsomag"
},
"project-type.datapack.singular": {
"message": "Adatcsomag"
},
"project-type.minecraft_java_server.plural": {
"message": "Szerverek"
"message": "Szerver"
},
"project-type.minecraft_java_server.singular": {
"message": "Szerver"
},
"project-type.mod.plural": {
"message": "Modok"
"message": "Mod"
},
"project-type.mod.singular": {
"message": "Mod"
},
"project-type.modpack.plural": {
"message": "Modcsomagok"
},
"project-type.modpack.singular": {
"message": "Modcsomag"
},
"project-type.modpack.singular": {
"message": "Modpack"
},
"project-type.plugin.plural": {
"message": "Bővítmények"
"message": "Bővítmény"
},
"project-type.plugin.singular": {
"message": "Bővítmény"
},
"project-type.project.plural": {
"message": "Projektek"
"message": "Projekt"
},
"project-type.project.singular": {
"message": "Projekt"
},
"project-type.resourcepack.plural": {
"message": "Forráscsomagok"
"message": "Forráscsomag"
},
"project-type.resourcepack.singular": {
"message": "Forráscsomag"
},
"project-type.server.plural": {
"message": "Szerverek"
"message": "Szerver"
},
"project-type.server.singular": {
"message": "Szerver"
},
"project-type.shader.plural": {
"message": "Shaderek"
"message": "Shader"
},
"project-type.shader.singular": {
"message": "Shader"
@@ -2190,7 +2169,7 @@
"message": "Projekt nem található"
},
"project.gallery.title": {
"message": "Képek"
"message": "Galéria"
},
"project.license.error": {
"message": "A licensz szövege nem tölthető le."
@@ -2340,13 +2319,13 @@
"message": "Jelentés benyújtása"
},
"scopes.analytics.description": {
"message": "Statisztikai adataid elérése"
"message": "Analitikai adataid elérése"
},
"scopes.analytics.label": {
"message": "Statisztikák olvasása"
"message": "Analitikák olvasása"
},
"scopes.category.analytics": {
"message": "Statisztikák"
"message": "Elemzések"
},
"scopes.category.collections": {
"message": "Kollekciók"
@@ -2466,10 +2445,10 @@
"message": "PAT-ek írása"
},
"scopes.performAnalytics.description": {
"message": "Statisztikai műveletek végrehajtása"
"message": "Analitikai tevékenységek végrehajtása"
},
"scopes.performAnalytics.label": {
"message": "Statisztikák végrehajtása"
"message": "Analitikák végrehajtása"
},
"scopes.projectCreate.description": {
"message": "Új projektek létrehozása"
@@ -2540,15 +2519,6 @@
"scopes.threadWrite.label": {
"message": "Szálakban írás"
},
"search.filter.locked.server": {
"message": "A szerver által van megadva"
},
"search.filter.locked.server-game-version.title": {
"message": "A játékverzió a szerver által van megadva"
},
"search.filter.locked.server-loader.title": {
"message": "A betöltő a szerver által van megadva"
},
"search.filter.locked.server.sync": {
"message": "Szinkronizálás a szerverrel"
},
@@ -2585,27 +2555,6 @@
"servers.plan.small.description": {
"message": "Tökéletes 15 barát számára, néhány kisebb moddal."
},
"settings.account.button.complete-setup": {
"message": "Beállítás befejezése"
},
"settings.account.data-export.action.download": {
"message": "Exportálás letöltése"
},
"settings.account.data-export.action.generate": {
"message": "Exportálás"
},
"settings.account.data-export.action.generating": {
"message": "Exportálás..."
},
"settings.account.data-export.description": {
"message": "Másolatot kér az összes személyes adatról, amelyet a Modrinthra feltöltött. A feldolgozás néhány percig is eltarthat."
},
"settings.account.data-export.title": {
"message": "Adatok exportálása"
},
"settings.account.delete.confirm.description": {
"message": "Ez **azonnal törli az összes felhasználói adatodat és követőidet**. A projektjeid nem kerülnek törlésre. A fiók törlése visszafordíthatatlan.<br><br>Ha segítségre van szükséged a fiókoddal kapcsolatban, kérj támogatást a [Modrinth Discord](https://discord.modrinth.com)on."
},
"settings.account.delete.confirm.proceed": {
"message": "Fiók törlése"
},
@@ -2615,9 +2564,6 @@
"settings.account.delete.section.action": {
"message": "Fiók törlése"
},
"settings.account.delete.section.description": {
"message": "A fiók törlése után nincs visszaút. A fiók törlésével a projektek kivételével minden kapcsolódó adat eltávolításra kerül a szervereinkről."
},
"settings.account.delete.section.title": {
"message": "Fiók törlése"
},
@@ -2625,22 +2571,16 @@
"message": "E-mail mentése"
},
"settings.account.email.field.label": {
"message": "E-mail cím"
"message": "E-mail-cím"
},
"settings.account.email.field.placeholder": {
"message": "Írd ide az e-mail címedet..."
},
"settings.account.email.modal.header.add": {
"message": "E-mail cím hozzáadása"
"message": "E-mail hozzáadása"
},
"settings.account.email.modal.header.change": {
"message": "E-mail cím megváltoztatása"
},
"settings.account.email.modal.notice": {
"message": "A fiókadataid nem jelennek meg nyilvánosan."
},
"settings.account.password.action.remove": {
"message": "Jelszó törlése"
"message": "E-mail megváltoztatása"
},
"settings.account.password.action.save": {
"message": "Jelszó mentése"
@@ -2681,105 +2621,27 @@
"settings.account.password.modal.header.change": {
"message": "Jelszó módosítása"
},
"settings.account.password.modal.header.remove": {
"message": "Jelszó törlése"
},
"settings.account.providers.action.add": {
"message": "Hozzáadás"
},
"settings.account.providers.modal.header": {
"message": "Hitelesítési szolgáltatók"
},
"settings.account.providers.table.actions": {
"message": "Műveletek"
},
"settings.account.providers.table.provider": {
"message": "Szolgáltató"
},
"settings.account.security.email.action.add": {
"message": "E-mail cím hozzáadása"
},
"settings.account.security.email.action.change": {
"message": "E-mail cím módosítása"
},
"settings.account.security.email.description": {
"message": "Módosítja a fiókodhoz tartozó e-mail címet."
},
"settings.account.security.email.title": {
"message": "E-mail cím"
},
"settings.account.security.password.action.add": {
"message": "Jelszó hozzáadása"
},
"settings.account.security.password.action.change": {
"message": "Jelszó módosítása"
},
"settings.account.security.password.description.change": {
"message": "Módosítsd a fiókodba való bejelentkezéshez használt jelszót."
},
"settings.account.security.password.description.change-or-remove": {
"message": "Módosítsd vagy töröld a fiókodba való bejelentkezéshez használt jelszót."
},
"settings.account.security.password.description.set": {
"message": "Állíts be egy állandó jelszót a fiókodba való bejelentkezéshez."
"message": "E-mail"
},
"settings.account.security.password.title": {
"message": "Jelszó"
},
"settings.account.security.providers.action.manage": {
"message": "Szolgáltatók kezelése"
},
"settings.account.security.providers.description": {
"message": "Hozzáadhatod vagy eltávolíthatod a fiókodhoz a bejelentkezési módszereket, beleértve a GitHubot, a GitLabot, a Microsoftot, a Discordot, a Steamet és a Google-t."
},
"settings.account.security.providers.title": {
"message": "Hitelesítési szolgáltatók kezelése"
},
"settings.account.security.title": {
"message": "Fiókbiztonság"
},
"settings.account.security.two-factor.action.remove": {
"message": "A kétlépcsős hitelesítés kikapcsolása"
"message": "A kétlépcsős hitelesítés kikapcsolása "
},
"settings.account.security.two-factor.action.setup": {
"message": "A kétlépcsős hitelesítés beállítása"
},
"settings.account.security.two-factor.description": {
"message": "Biztosíts további védelmet a fiókodnak."
},
"settings.account.security.two-factor.title": {
"message": "Kétlépcsős hitelesítés"
},
"settings.account.two-factor.backup.intro": {
"message": "Töltse le ezeket a biztonsági kódokat, és őrizze meg őket biztonságos helyen. Ha valaha is elveszítené a hozzáférését az eszközéhez, ezeket a kódokat használhatja a kétlépcsős hitelesítés kódja helyett! Ezeket a kódokat ugyanúgy óvnia kell, mint a jelszavát."
},
"settings.account.two-factor.backup.single-use": {
"message": "A biztonsági kódok csak egyszer használhatók fel."
},
"settings.account.two-factor.error.incorrect-code": {
"message": "A megadott kód helytelen!"
},
"settings.account.two-factor.field.code.description": {
"message": "Kérjük, írja be a kétlépcsős hitelesítés kódját a folytatáshoz."
},
"settings.account.two-factor.field.code.label": {
"message": "Írd be a kétlépcsős hitelesítés kódját"
},
"settings.account.two-factor.field.code.placeholder": {
"message": "Írd ide a kódot..."
},
"settings.account.two-factor.setup.intro": {
"message": "A kétlépcsős hitelesítés biztosítja fiókod biztonságát azzal, hogy a bejelentkezéshez egy második eszköz használatát is megköveteli."
},
"settings.account.two-factor.setup.scan": {
"message": "Olvassa be a QR-kódot az <authy-link>Authy</authy-link>, a <microsoft-authenticator-link>Microsoft Authenticator</microsoft-authenticator-link> vagy bármely más kétlépcsős hitelesítési alkalmazás segítségével a folyamat megkezdéséhez."
},
"settings.account.two-factor.verify.description": {
"message": "Írja be az hitelesítőalkalmazásból kapott egyszeri kódot a hozzáférés igazolásához."
},
"settings.account.two-factor.verify.label": {
"message": "Kód ellenőrzése"
},
"settings.applications.about": {
"message": "Rólunk"
},
@@ -2811,7 +2673,7 @@
"message": "Ikon feltöltése"
},
"settings.applications.client-id": {
"message": "Kliensazonosító"
"message": "Kliens ID"
},
"settings.applications.client-secret": {
"message": "Kliens secret"
@@ -2855,9 +2717,6 @@
"settings.applications.field.url.placeholder": {
"message": "https://example.com"
},
"settings.applications.head-title": {
"message": "Alkalmazások"
},
"settings.applications.modal.header": {
"message": "Alkamazás információ"
},
@@ -2870,15 +2729,6 @@
"settings.applications.secret.disclaimer": {
"message": "A secreteted most mentesd el, el lesz tüntetve mituán elhagyod ezt az oldalt!"
},
"settings.authorizations.by": {
"message": "által"
},
"settings.billing.interval.month": {
"message": "hónap"
},
"settings.billing.midas.benefits.ad-free": {
"message": "Reklámmentes böngészés a modrinth.com-on és a Modrinth App-ban"
},
"settings.billing.modal.cancel.action": {
"message": "Előfizetés lemondása"
},
@@ -2915,27 +2765,15 @@
"settings.billing.subscription.title": {
"message": "Előfizetések"
},
"settings.billing.switch.tooltip.monthly-additional-per-year": {
"message": "A havi számlázás évente további {amount} költséggel jár"
},
"settings.display.banner.developer-mode.button": {
"message": "A fejlesztői mód letiltása"
"message": "Fejlesztői mód deaktiválása"
},
"settings.display.banner.developer-mode.description": {
"message": "A <strong>fejlesztői mód</strong> aktív. Ez lehetővé teszi, hogy megtekintsd a Modrinth különböző elemeinek belső azonosítóit, ami hasznos lehet, ha a Modrinth API-t használó fejlesztő vagy. Kattints ötször a lap alján található Modrinth logóra a fejlesztői mód bekapcsolásához."
},
"settings.display.flags.description": {
"message": "Bizonyos funkciók engedélyezése vagy letiltása ezen az eszközön."
},
"settings.display.flags.title": {
"message": "Funkciók be-/kikapcsolása"
},
"settings.display.notification.developer-mode-deactivated.text": {
"message": "A fejlesztői mód le lett tiltva"
},
"settings.display.notification.developer-mode-deactivated.title": {
"message": "Fejlesztői mód letiltva"
},
"settings.display.project-list-layouts.datapack": {
"message": "Adatcsomagok oldal"
},
@@ -2945,15 +2783,6 @@
"settings.display.project-list-layouts.mod": {
"message": "Modok oldal"
},
"settings.display.project-list-layouts.mode.gallery": {
"message": "Képek"
},
"settings.display.project-list-layouts.mode.grid": {
"message": "Rács"
},
"settings.display.project-list-layouts.mode.rows": {
"message": "Lista"
},
"settings.display.project-list-layouts.modpack": {
"message": "Modcsomagok oldal"
},
@@ -2967,13 +2796,13 @@
"message": "Szerverek oldal"
},
"settings.display.project-list-layouts.shader": {
"message": "Shaderek oldal"
"message": "Shaferek oldal"
},
"settings.display.project-list-layouts.title": {
"message": "Projektlista elrendezések"
},
"settings.display.project-list-layouts.user": {
"message": "Profil oldalak"
"message": "Felhasználói profil oldalai"
},
"settings.display.project-list.layouts.collection": {
"message": "Gyűjtemény"
@@ -3002,9 +2831,6 @@
"settings.display.theme.title": {
"message": "Téma"
},
"settings.head-title": {
"message": "Megjelenési beállítások"
},
"settings.pats.action.create": {
"message": "PAT létrehozása"
},
@@ -3062,9 +2888,6 @@
"settings.profile.description": {
"message": "A rofiladataid nyilvánosan megtekinthetők a Modrinth oldalon és a <docs-link>Modrinth API</docs-link>-n keresztül."
},
"settings.profile.head-title": {
"message": "Profilbeállítások"
},
"settings.profile.profile-info": {
"message": "Profilinformációk"
},
@@ -3095,15 +2918,6 @@
"settings.sessions.unknown-platform": {
"message": "Ismeretlen platform"
},
"settings.sidebar.label.account": {
"message": "Fiók"
},
"settings.sidebar.label.developer": {
"message": "Fejlesztő"
},
"settings.sidebar.label.display": {
"message": "Megjelenés"
},
"ui.latest-news-row.latest-news": {
"message": "A legújabb hírek a Modrinthról"
},
@@ -1688,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Temukan konten"
},
"layout.nav.feature-flags": {
"message": "Bendera fitur"
},
"layout.nav.get-modrinth-app": {
"message": "Dapatkan Modrinth App"
},
+3 -21
View File
@@ -1313,9 +1313,6 @@
"hosting.loader.failed-to-repair": {
"message": "Errore nella riparazione del server"
},
"hosting.loader.failed-to-reset-to-onboarding": {
"message": "Errore nella reinizializzazione"
},
"hosting.loader.failed-to-save-settings": {
"message": "Errore nel salvataggio delle impostazioni"
},
@@ -1337,24 +1334,6 @@
"hosting.loader.reset-server-description": {
"message": "Rimuove tutti i dati dal tuo server, inclusi i mondi, mod, e configurazioni. Eventuali backup rimarranno intatti e potranno essere ripristinati."
},
"hosting.loader.reset-to-onboarding-button": {
"message": "Reinizializza"
},
"hosting.loader.reset-to-onboarding-modal-description": {
"message": "Il server verrà ripristinato alla configurazione iniziale così da poterlo riconfigurare. Vuoi davvero continuare?"
},
"hosting.loader.reset-to-onboarding-modal-title": {
"message": "Reinizializza"
},
"hosting.loader.reset-to-onboarding-success-description": {
"message": "Il server è stato ripristinato alla configurazione iniziale."
},
"hosting.loader.reset-to-onboarding-success-title": {
"message": "Server reinizializzato"
},
"hosting.loader.support-options-title": {
"message": "Opzioni di assistenza"
},
"hosting.plan.out-of-stock": {
"message": "Non disponibile"
},
@@ -1709,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "Esplora i contenuti"
},
"layout.nav.feature-flags": {
"message": "Flag delle funzionalità"
},
"layout.nav.get-modrinth-app": {
"message": "Scarica Modrinth App"
},
+3 -198
View File
@@ -1313,9 +1313,6 @@
"hosting.loader.failed-to-repair": {
"message": "サーバーの修復に失敗しました"
},
"hosting.loader.failed-to-reset-to-onboarding": {
"message": "サーバー設定の初期化に失敗しました"
},
"hosting.loader.failed-to-save-settings": {
"message": "インストール設定の保存に失敗しました"
},
@@ -1337,24 +1334,6 @@
"hosting.loader.reset-server-description": {
"message": "サーバー上のワールド、Mod、設定ファイルを含むすべてのデータを削除します。 バックアップは残り、復元できます。"
},
"hosting.loader.reset-to-onboarding-button": {
"message": "初期状態に戻す"
},
"hosting.loader.reset-to-onboarding-modal-description": {
"message": "これを行うことでサーバーが初期状態に戻されるためセットアップをもう一度行う必要があります。本当に続行しますか?"
},
"hosting.loader.reset-to-onboarding-modal-title": {
"message": "初期化"
},
"hosting.loader.reset-to-onboarding-success-description": {
"message": "サーバーが初期状態に戻されました。"
},
"hosting.loader.reset-to-onboarding-success-title": {
"message": "サーバー初期化"
},
"hosting.loader.support-options-title": {
"message": "サポート項目"
},
"hosting.plan.out-of-stock": {
"message": "品切れ"
},
@@ -1709,6 +1688,9 @@
"layout.nav.discover-content": {
"message": "コンテンツを探索"
},
"layout.nav.feature-flags": {
"message": "機能フラグ"
},
"layout.nav.get-modrinth-app": {
"message": "Modrinth Appを入手"
},
@@ -3068,15 +3050,6 @@
"settings.account.two-factor.setup.manual-secret": {
"message": "QRコードが読み取れない場合は、コードを手動で入力してください:"
},
"settings.account.two-factor.setup.scan": {
"message": "以下のQRコードを <authy-link>Authy</authy-link>, <microsoft-authenticator-link>Microsoft Authenticator</microsoft-authenticator-link>, またはその他の2FA(二要素認証)アプリで読み取って設定しましょう。"
},
"settings.account.two-factor.verify.description": {
"message": "認証アプリに表示されたワンタイムコードを入力してアクセスを認証します。"
},
"settings.account.two-factor.verify.label": {
"message": "コードを認証"
},
"settings.applications.about": {
"message": "概要"
},
@@ -3158,9 +3131,6 @@
"settings.applications.field.url.placeholder": {
"message": "https://example.com"
},
"settings.applications.head-title": {
"message": "アプリケーション"
},
"settings.applications.modal.header": {
"message": "アプリケーション情報"
},
@@ -3173,90 +3143,6 @@
"settings.applications.secret.disclaimer": {
"message": "今すぐ秘密情報を保存しましょう。このページを離れると非表示になります!"
},
"settings.authorizations.about-this-app": {
"message": "このアプリについて"
},
"settings.authorizations.by": {
"message": "作成者"
},
"settings.authorizations.description": {
"message": "Modrinthアカウントでアプリケーションを承認することにより、アプリケーションがあなたのアカウントにアクセスできるようになります。 アクセス権はいつでも確認でき、変更可能です。"
},
"settings.authorizations.empty-state": {
"message": "現在承認済みアプリを表示することができません。現在修正中のため、また後ほど確認ください!"
},
"settings.authorizations.head-title": {
"message": "承認"
},
"settings.authorizations.revoke.action": {
"message": "取り消す"
},
"settings.authorizations.revoke.confirm.description": {
"message": "アプリケーションによるアカウントのアクセス権を取り消します。アプリケーションはいつでも再承認可能です。"
},
"settings.authorizations.revoke.confirm.title": {
"message": "アプリケーションのアクセス権を取り消してもよろしいですか?"
},
"settings.billing.charges.description": {
"message": "Modrinthアカウントでの過去の支払い履歴は、こちらに表示されます:"
},
"settings.billing.charges.product.medal-trial": {
"message": "Medal Server トライアル"
},
"settings.billing.charges.product.midas": {
"message": "Modrinth Plus"
},
"settings.billing.charges.product.pyro": {
"message": "Modrinth Hosting"
},
"settings.billing.expires": {
"message": "有効期限: {date}"
},
"settings.billing.interval.month": {
"message": "月"
},
"settings.billing.interval.monthly": {
"message": "月間"
},
"settings.billing.interval.year": {
"message": "年"
},
"settings.billing.interval.yearly": {
"message": "年間"
},
"settings.billing.midas.benefits.ad-free": {
"message": "modrinth.comとModrinth Appを広告なしでブラウジング"
},
"settings.billing.midas.benefits.badge": {
"message": "Modrinth+バッジをプロフィールに表示"
},
"settings.billing.midas.benefits.support": {
"message": "Modrinthとクリエイターを直接支援"
},
"settings.billing.midas.benefits.title": {
"message": "特典"
},
"settings.billing.midas.save-per-year": {
"message": "年間プランなら {amount}/年 お得!"
},
"settings.billing.midas.status.cancelled.line1": {
"message": "サブスクリプションをキャンセルしました。"
},
"settings.billing.midas.status.cancelled.line2": {
"message": "特典は現在のお支払いサイクル終了日まで継続します。"
},
"settings.billing.midas.status.failed": {
"message": "サブスクリプションの決済に失敗しました。 お支払い方法を変更してください。"
},
"settings.billing.midas.status.open": {
"message": "現在加入中のサブスクリプション:"
},
"settings.billing.midas.status.processing": {
"message": "決済を処理中です。 特典は決済の完了後に有効になります。"
},
"settings.billing.midas.upsell": {
"message": "Modrinth Plusに加入しよう!"
},
"settings.billing.modal.cancel.action": {
"message": "サブスクリプションを解除する"
},
@@ -3332,69 +3218,18 @@
"settings.billing.pyro.resubscribe.error.title": {
"message": "再登録エラー"
},
"settings.billing.pyro.resubscribe.request-submitted.text": {
"message": "サーバーが一時停止中の場合、再請求の試行まで最大10分かかることがあります。"
},
"settings.billing.pyro.resubscribe.request-submitted.title": {
"message": "再加入申請を受け付けました"
},
"settings.billing.pyro.resubscribe.success.text": {
"message": "サーバーのサブスクリプションに再加入しました"
},
"settings.billing.pyro.status.failed": {
"message": "サブスクリプションの決済に失敗しました。 お支払い方法を変更して、もう一度再加入してください。"
},
"settings.billing.pyro.status.processing": {
"message": "決済を処理中です。 サーバーは決済の完了後に有効になります。"
},
"settings.billing.pyro.storage": {
"message": "{gb} GB SSD"
},
"settings.billing.pyro.swap": {
"message": "{gb} GB スワップ領域"
},
"settings.billing.pyro_subscription.description": {
"message": "Modrinth Server のサブスクリプションを管理する。"
},
"settings.billing.pyro_subscription.title": {
"message": "Modrinth Server のサブスクリプション"
},
"settings.billing.renews": {
"message": "次の更新日: {date}"
},
"settings.billing.resubscribe": {
"message": "再加入"
},
"settings.billing.since": {
"message": "加入日: {date}"
},
"settings.billing.subscribe": {
"message": "加入"
},
"settings.billing.subscription.description": {
"message": "Modrinth のサブスクリプションを管理する。"
},
"settings.billing.subscription.title": {
"message": "サブスクリプション"
},
"settings.billing.switch.switching-to-interval": {
"message": "{interval} に変更中"
},
"settings.billing.switch.to-interval": {
"message": "{interval} に変更"
},
"settings.billing.switch.tooltip.monthly-additional-per-year": {
"message": "月払いの場合年間で {amount} 高くなります"
},
"settings.billing.switches-to-billing-on": {
"message": "{date}に {interval} 払いに変更されます"
},
"settings.billing.update-method": {
"message": "支払い方法を更新"
},
"settings.billing.upgrade": {
"message": "アップグレード"
},
"settings.display.banner.developer-mode.button": {
"message": "開発者モードを無効にする"
},
@@ -3407,12 +3242,6 @@
"settings.display.flags.title": {
"message": "機能の切り替え"
},
"settings.display.notification.developer-mode-deactivated.text": {
"message": "開発者モードが無効になりました"
},
"settings.display.notification.developer-mode-deactivated.title": {
"message": "開発者モード無効"
},
"settings.display.project-list-layouts.datapack": {
"message": "データパックページ"
},
@@ -3422,15 +3251,6 @@
"settings.display.project-list-layouts.mod": {
"message": "Modページ"
},
"settings.display.project-list-layouts.mode.gallery": {
"message": "ギャラリー"
},
"settings.display.project-list-layouts.mode.grid": {
"message": "グリッド表示"
},
"settings.display.project-list-layouts.mode.rows": {
"message": "行表示"
},
"settings.display.project-list-layouts.modpack": {
"message": "Modパックページ"
},
@@ -3491,9 +3311,6 @@
"settings.display.theme.title": {
"message": "テーマ"
},
"settings.head-title": {
"message": "表示設定"
},
"settings.pats.action.create": {
"message": "PATを作成"
},
@@ -3554,9 +3371,6 @@
"settings.profile.description": {
"message": "あなたのプロフィール情報は、Modrinth上および<docs-link>Modrinth API</docs-link>を通じて一般公開されます。"
},
"settings.profile.head-title": {
"message": "プロフィール設定"
},
"settings.profile.profile-info": {
"message": "プロフィール情報"
},
@@ -3587,15 +3401,6 @@
"settings.sessions.unknown-platform": {
"message": "不明なプラットフォーム"
},
"settings.sidebar.label.account": {
"message": "アカウント"
},
"settings.sidebar.label.developer": {
"message": "開発者"
},
"settings.sidebar.label.display": {
"message": "表示"
},
"ui.latest-news-row.latest-news": {
"message": "Modrinthの最新ニュース"
},
+12 -486
View File
@@ -1299,61 +1299,7 @@
"message": "좋아하는 모드로 플레이하세요"
},
"hosting-marketing.why.your-favorite-mods.description": {
"message": "바닐라, Fabric, Forge, Quilt, NeoForge 중에서 선택하세요. Modrinth에서 실행되는 모드라면 여러분의 서버에서도 실행할 수 있습니다."
},
"hosting.loader.failed-to-change-version": {
"message": "모드팩 버전 변경 실패"
},
"hosting.loader.failed-to-load-versions": {
"message": "버전 불러오기 실패"
},
"hosting.loader.failed-to-reinstall": {
"message": "모드팩 재설치 실패"
},
"hosting.loader.failed-to-repair": {
"message": "서버 복구 실패"
},
"hosting.loader.failed-to-reset-to-onboarding": {
"message": "서버 온보딩 상태로 재설정 실패"
},
"hosting.loader.failed-to-save-settings": {
"message": "설치 설정 저장 실패"
},
"hosting.loader.failed-to-unlink": {
"message": "모드팩 연결 해제 실패"
},
"hosting.loader.loader-version": {
"message": "{loader, select, null {로더} other {{loader}}} 버전"
},
"hosting.loader.repair-started-text": {
"message": "서버 설치가 복구되었습니다."
},
"hosting.loader.repair-started-title": {
"message": "복구 완료"
},
"hosting.loader.reset-server": {
"message": "서버 초기화"
},
"hosting.loader.reset-server-description": {
"message": "서버에 저장된 세계, 모드, 설정 파일 등의 모든 데이터가 삭제됩니다. 백업 파일은 그대로 유지되며, 필요 시 복원할 수 있습니다."
},
"hosting.loader.reset-to-onboarding-button": {
"message": "온보딩 상태로 재설정"
},
"hosting.loader.reset-to-onboarding-modal-description": {
"message": "서버가 다시 온보딩 단계로 돌아가 설정을 다시 완료할 수 있습니다. 계속하시겠습니까?"
},
"hosting.loader.reset-to-onboarding-modal-title": {
"message": "온보딩 상태로 재설정"
},
"hosting.loader.reset-to-onboarding-success-description": {
"message": "서버가 온보딩 상태로 되돌아갔습니다."
},
"hosting.loader.reset-to-onboarding-success-title": {
"message": "온보딩 상태로 서버 재설정"
},
"hosting.loader.support-options-title": {
"message": "지원 옵션"
"message": "바닐라, 패브릭, 포지, 퀼트, 네오포지 중에서 선택하세요. 모드린스에서 실행되는 모드라면 여러분의 서버에서도 실행할 수 있습니다."
},
"hosting.plan.out-of-stock": {
"message": "품절"
@@ -1419,7 +1365,7 @@
"message": "원하는 런처로 플레이하세요"
},
"landing.feature.search.description": {
"message": "Modrinth의 번개처럼 빠른 검색과 강력한 필터로 입력하는 즉시 원하는 것을 찾을 수 있습니다."
"message": "모드린스의 번개처럼 빠른 검색과 강력한 필터로 입력하는 즉시 원하는 것을 찾을 수 있습니다."
},
"landing.feature.search.heading": {
"message": "원하는 프로젝트를 쉽고 빠르게 찾으세요"
@@ -1452,7 +1398,7 @@
"message": "ATLauncher"
},
"landing.launcher.graphic-alt": {
"message": "Minecraft 창을 단순화한 표현으로, Modrinth 그린 색상의 Mojang Studios 로고가 포함되어 있습니다."
"message": "마인크래프트 창을 단순화한 표현으로, 모드린스 그린 색상의 모장 스튜디오 로고가 포함되어 있습니다."
},
"landing.launcher.modrinth-app-label": {
"message": "Modrinth App"
@@ -1689,7 +1635,7 @@
"message": "메뉴 전환"
},
"layout.meta.description": {
"message": "Modrinth에서 Minecraft 모드, 플러그인, 데이터 팩, 셰이더, 리소스 팩, 모드팩을 다운로드하세요. 현대적이고 사용하기 쉬운 인터페이스와 API를 통해 Modrinth에서 프로젝트를 탐색하고 게시하세요."
"message": "Modrinth에서 Minecraft 모드, 플러그인, 데이터팩, 셰이더, 리소스팩, 모드팩을 다운로드하세요. 현대적이고 사용하기 쉬운 인터페이스와 API를 통해 Modrinth에서 프로젝트를 탐색하고 게시하세요."
},
"layout.meta.og-description": {
"message": "Minecraft 콘텐츠를 탐색하고 게시하세요!"
@@ -1709,6 +1655,9 @@
"layout.nav.discover-content": {
"message": "콘텐츠 탐색하기"
},
"layout.nav.feature-flags": {
"message": "기능 플래그"
},
"layout.nav.get-modrinth-app": {
"message": "Modrinth App 받기"
},
@@ -2247,7 +2196,7 @@
"message": "{license} 라이선스"
},
"project.about.details.published": {
"message": "{date} 게시"
"message": "{date} 게시"
},
"project.about.details.submitted": {
"message": "{date} 에 제출됨"
@@ -2256,7 +2205,7 @@
"message": "세부 사항"
},
"project.about.details.updated": {
"message": "{date} 업데이트"
"message": "{date} 업데이트"
},
"project.actions.create-server": {
"message": "서버 만들기"
@@ -2831,18 +2780,6 @@
"search.filter.locked.server.sync": {
"message": "서버와 동기화"
},
"servers.busy.backup-creating": {
"message": "백업 생성 진행 중"
},
"servers.busy.backup-restoring": {
"message": "백업 복원 진행 중"
},
"servers.busy.installing": {
"message": "서버 설치 중"
},
"servers.busy.syncing-content": {
"message": "콘텐츠 동기화 진행 중"
},
"servers.notice.actions": {
"message": "활동"
},
@@ -2879,204 +2816,6 @@
"servers.plan.small.description": {
"message": "1–5명의 친구와 적은 수의 가벼운 모드에 적합합니다."
},
"settings.account.button.complete-setup": {
"message": "설정 완료"
},
"settings.account.data-export.action.download": {
"message": "데이터 다운로드"
},
"settings.account.data-export.action.generate": {
"message": "데이터 생성"
},
"settings.account.data-export.action.generating": {
"message": "데이터 생성 중..."
},
"settings.account.data-export.description": {
"message": "Modrinth에 업로드한 모든 개인 데이터의 사본을 요청합니다. 처리하는 데 몇 분 정도 소요될 수 있습니다."
},
"settings.account.data-export.title": {
"message": "데이터 내보내기"
},
"settings.account.delete.confirm.description": {
"message": "이 작업은 **모든 사용자 데이터와 팔로우 목록을 즉시 삭제합니다**. 단, 프로젝트는 삭제되지 않습니다. 계정 삭제는 되돌릴 수 없습니다.<br><br>계정 관련 도움이 필요하면 [Modrinth Discord](https://discord.modrinth.com)에서 도움을 받으세요."
},
"settings.account.delete.confirm.proceed": {
"message": "계정 삭제"
},
"settings.account.delete.confirm.title": {
"message": "정말로 계정을 삭제하시겠습니까?"
},
"settings.account.delete.section.action": {
"message": "계정 삭제"
},
"settings.account.delete.section.description": {
"message": "계정을 삭제하면 되돌릴 수 없으며, 프로젝트를 제외한 모든 관련 데이터가 서버에서 삭제됩니다."
},
"settings.account.delete.section.title": {
"message": "계정 삭제"
},
"settings.account.email.action.save": {
"message": "이메일 저장"
},
"settings.account.email.field.label": {
"message": "이메일 주소"
},
"settings.account.email.field.placeholder": {
"message": "이메일 주소 입력..."
},
"settings.account.email.modal.header.add": {
"message": "이메일 추가"
},
"settings.account.email.modal.header.change": {
"message": "이메일 변경"
},
"settings.account.email.modal.notice": {
"message": "계정 정보는 공개되지 않습니다."
},
"settings.account.password.action.remove": {
"message": "비밀번호 제거"
},
"settings.account.password.action.save": {
"message": "비밀번호 저장"
},
"settings.account.password.error.mismatch": {
"message": "두 비밀번호가 일치하지 않습니다!"
},
"settings.account.password.field.confirm-current.description": {
"message": "계속하려면 비밀번호를 입력해 주세요."
},
"settings.account.password.field.confirm-current.label": {
"message": "비밀번호 확인"
},
"settings.account.password.field.confirm-current.placeholder": {
"message": "비밀번호 확인"
},
"settings.account.password.field.confirm-new.label": {
"message": "새 비밀번호 확인"
},
"settings.account.password.field.confirm-new.placeholder": {
"message": "새 비밀번호 확인"
},
"settings.account.password.field.new.label": {
"message": "새 비밀번호"
},
"settings.account.password.field.new.placeholder": {
"message": "새 비밀번호"
},
"settings.account.password.field.old.label": {
"message": "이전 비밀번호"
},
"settings.account.password.field.old.placeholder": {
"message": "이전 비밀번호"
},
"settings.account.password.modal.header.add": {
"message": "비밀번호 추가"
},
"settings.account.password.modal.header.change": {
"message": "비밀번호 변경"
},
"settings.account.password.modal.header.remove": {
"message": "비밀번호 제거"
},
"settings.account.providers.action.add": {
"message": "추가"
},
"settings.account.providers.modal.header": {
"message": "인증 제공자"
},
"settings.account.providers.table.actions": {
"message": "작업"
},
"settings.account.providers.table.provider": {
"message": "제공자"
},
"settings.account.security.email.action.add": {
"message": "이메일 추가"
},
"settings.account.security.email.action.change": {
"message": "이메일 변경"
},
"settings.account.security.email.description": {
"message": "계정에 연결된 이메일을 변경합니다."
},
"settings.account.security.email.title": {
"message": "이메일"
},
"settings.account.security.password.action.add": {
"message": "비밀번호 추가"
},
"settings.account.security.password.action.change": {
"message": "비밀번호 변경"
},
"settings.account.security.password.description.change": {
"message": "계정에 로그인하는 비밀번호 변경."
},
"settings.account.security.password.description.change-or-remove": {
"message": "계정에 로그인시 사용되는 비밀번호 변경."
},
"settings.account.security.password.description.set": {
"message": "계정에 로그인할때 사용되는 영구적인 비밀번호 설정."
},
"settings.account.security.password.title": {
"message": "비밀번호"
},
"settings.account.security.providers.action.manage": {
"message": "제공자 관리"
},
"settings.account.security.providers.description": {
"message": "GitHub, GitLab, Microsoft, Discord, Steam, Google 등 다양한 로그인 방법을 계정에 추가하거나 제거할 수 있습니다."
},
"settings.account.security.providers.title": {
"message": "인증 제공자 관리하기"
},
"settings.account.security.title": {
"message": "계정 보안"
},
"settings.account.security.two-factor.action.remove": {
"message": "2FA 제거"
},
"settings.account.security.two-factor.action.setup": {
"message": "2FA 설정"
},
"settings.account.security.two-factor.description": {
"message": "계정에 로그인하는데 추가적인 단계의 보안을 추가합니다."
},
"settings.account.security.two-factor.title": {
"message": "2단계 인증"
},
"settings.account.two-factor.backup.intro": {
"message": "이 백업 코드들을 안전한 곳에 저장해 두세요. 이 백업 코드들은 기기를 사용할 수 없을때 2단계 인증 코드 대용으로 사용할 수 있습니다! 이 코드들을 비밀번호처럼 안전하게 보관하세요."
},
"settings.account.two-factor.backup.single-use": {
"message": "백업 코드는 한번만 사용 할 수 있습니다."
},
"settings.account.two-factor.error.incorrect-code": {
"message": "입력한 코드가 맞지 않습니다!"
},
"settings.account.two-factor.field.code.description": {
"message": "진행하려면 2단계 인증 코드를 입력해 주세요."
},
"settings.account.two-factor.field.code.label": {
"message": "2단계 인증 코드 입력"
},
"settings.account.two-factor.field.code.placeholder": {
"message": "코드 입력..."
},
"settings.account.two-factor.setup.intro": {
"message": "2단계 인증은 로그인시 또 다른 기기의 접속을 요구함으로써 계정을 보호합니다."
},
"settings.account.two-factor.setup.manual-secret": {
"message": "QR 코드가 스캔되지 않는다면, 수동으로 코드를 입력할 수 있습니다:"
},
"settings.account.two-factor.setup.scan": {
"message": "시작하려면 <authy-link>Authy<authy-link>, <microsoft-authenticator-link>Microsoft Authenticator<microsoft-authenticator-link>, 또는 기타 2단계 인증 앱으로 QR 코드를 스캔하세요."
},
"settings.account.two-factor.verify.description": {
"message": "접근을 승인하려면 인증 앱에서 받은 일회용 코드를 입력하세요."
},
"settings.account.two-factor.verify.label": {
"message": "코드 인증"
},
"settings.applications.about": {
"message": "앱 정보"
},
@@ -3099,7 +2838,7 @@
"message": "편집"
},
"settings.applications.button.new": {
"message": "새 애플리케이션"
"message": "새로운 애플리케이션"
},
"settings.applications.button.save-changes": {
"message": "변경사항 저장"
@@ -3158,9 +2897,6 @@
"settings.applications.field.url.placeholder": {
"message": "https://example.com"
},
"settings.applications.head-title": {
"message": "애플리케이션"
},
"settings.applications.modal.header": {
"message": "신청정보"
},
@@ -3173,90 +2909,6 @@
"settings.applications.secret.disclaimer": {
"message": "지금 비밀을 저장하세요. 이 페이지를 나가면 비밀이 숨겨집니다!"
},
"settings.authorizations.about-this-app": {
"message": "이 앱에 대해"
},
"settings.authorizations.by": {
"message": "제작자"
},
"settings.authorizations.description": {
"message": "Modrinth 계정으로 애플리케이션에 권한을 부여하면, 해당 앱이 귀하의 계정에 접근할 수 있게 됩니다. 여기에서 언제든지 계정 접근 권한을 관리하고 확인할 수 있습니다."
},
"settings.authorizations.empty-state": {
"message": "현재 승인한 애플리케이션을 표시할 수 없습니다. 이 문제를 해결하기 위해 노력 중입니다. 나중에 다시 확인해 주세요!"
},
"settings.authorizations.head-title": {
"message": "승인"
},
"settings.authorizations.revoke.action": {
"message": "취소"
},
"settings.authorizations.revoke.confirm.description": {
"message": "해당 애플리케이션의 계정 접근 권한을 취소합니다. 언제든지 해당 애플리케이션에 대한 접근 권한을 다시 승인할 수 있습니다."
},
"settings.authorizations.revoke.confirm.title": {
"message": "정말로 이 애플리케이션의 접근 권한을 취소하시겠습니까?"
},
"settings.billing.charges.description": {
"message": "Modrinth 계정의 과거 결제 내역을 여기서 확인할 수 있습니다:"
},
"settings.billing.charges.product.medal-trial": {
"message": "Medal 서버 체험"
},
"settings.billing.charges.product.midas": {
"message": "Modrinth Plus"
},
"settings.billing.charges.product.pyro": {
"message": "Modrinth Hosting"
},
"settings.billing.expires": {
"message": "{date} 만료"
},
"settings.billing.interval.month": {
"message": "월"
},
"settings.billing.interval.monthly": {
"message": "월간"
},
"settings.billing.interval.year": {
"message": "년"
},
"settings.billing.interval.yearly": {
"message": "연간"
},
"settings.billing.midas.benefits.ad-free": {
"message": "Modrinth App 및 modrinth.com에서 광고 없이 브라우징"
},
"settings.billing.midas.benefits.badge": {
"message": "프로필에 Modrinth+ 배지"
},
"settings.billing.midas.benefits.support": {
"message": "Modrith와 크리에이터 후원"
},
"settings.billing.midas.benefits.title": {
"message": "장점"
},
"settings.billing.midas.save-per-year": {
"message": "연간 결제로 전환하면 연간 {amount} 절약할 수 있습니다!"
},
"settings.billing.midas.status.cancelled.line1": {
"message": "구독을 해지했습니다."
},
"settings.billing.midas.status.cancelled.line2": {
"message": "현재 청구 주기가 끝날 때까지 혜택을 계속 이용하실 수 있습니다."
},
"settings.billing.midas.status.failed": {
"message": "결제 처리에 실패했습니다. 결제 수단을 업데이트해 주세요."
},
"settings.billing.midas.status.open": {
"message": "현재 구독 중:"
},
"settings.billing.midas.status.processing": {
"message": "결제가 처리 중입니다. 결제가 완료되면 혜택이 활성화됩니다."
},
"settings.billing.midas.upsell": {
"message": "Modrinth Plus 구독자가 되어보세요!"
},
"settings.billing.modal.cancel.action": {
"message": "구독 취소"
},
@@ -3275,12 +2927,6 @@
"settings.billing.modal.delete.title": {
"message": "정말 이 결제 수단을 제거하시겠습니까?"
},
"settings.billing.next": {
"message": "다음:"
},
"settings.billing.or-yearly-save": {
"message": "또는 {price}/연간 ({percent}% 할인)!"
},
"settings.billing.payment_method.action.add": {
"message": "결제 수단 추가"
},
@@ -3302,99 +2948,18 @@
"settings.billing.payment_method.title": {
"message": "결제 수단"
},
"settings.billing.plan.title": {
"message": "{size} 플랜"
},
"settings.billing.price.per-interval": {
"message": "{price} / {interval}"
},
"settings.billing.price.slash-interval": {
"message": "/{interval}"
},
"settings.billing.pyro.cpu": {
"message": "{shared} 공유 CPU (최대 {bursts} CPU까지 버스트)"
},
"settings.billing.pyro.linked-server.not-found": {
"message": "이 구독에 연결된 서버를 찾을 수 없습니다. 이에 대한 몇 가지 원인이 있습니다. 서버를 방금 구매하신 경우, 이는 정상적인 현상입니다. 서버 프로비저닝에는 최대 1시간이 소요될 수 있습니다. 서버를 오래 전에 구매하신 경우, 그 사이에 서비스가 중단되었을 가능성이 높습니다. 이 외의 다른 상황이라면, 다음 정보를 포함하여 Modrinth 고객 지원에 문의해 주시기 바랍니다:"
},
"settings.billing.pyro.linked-server.server-id": {
"message": "서버 ID: {id}"
},
"settings.billing.pyro.linked-server.stripe-id": {
"message": "스트라이프 ID: {id}"
},
"settings.billing.pyro.ram": {
"message": "{gb} GB RAM"
},
"settings.billing.pyro.resubscribe.error.text": {
"message": "Modrinth 서버 재구독 중에 오류가 발생했습니다."
},
"settings.billing.pyro.resubscribe.error.title": {
"message": "재구독 오류"
},
"settings.billing.pyro.resubscribe.request-submitted.text": {
"message": "서버가 현재 일시 중지된 상태라면, 다음 결제 시도가 이루어지기까지 최대 10분이 소요될 수 있습니다."
},
"settings.billing.pyro.resubscribe.request-submitted.title": {
"message": "재구독 요청 접수됨"
},
"settings.billing.pyro.resubscribe.success.text": {
"message": "서버 구독이 성공적으로 갱신되었습니다"
},
"settings.billing.pyro.status.failed": {
"message": "결제 처리에 실패했습니다. 결제 수단을 업데이트해 주세요."
},
"settings.billing.pyro.status.processing": {
"message": "결제가 처리 중입니다. 결제가 완료되면 서버가 활성화 됩니다."
},
"settings.billing.pyro.storage": {
"message": "{gb} GB SSD"
},
"settings.billing.pyro.swap": {
"message": "{gb} GB 스왑 메모리"
},
"settings.billing.pyro_subscription.description": {
"message": "당신의 Modrinth Hosting 구독을 관리하세요."
},
"settings.billing.pyro_subscription.title": {
"message": "Modrinth Hosting 구독"
},
"settings.billing.renews": {
"message": "{date} 갱신"
},
"settings.billing.resubscribe": {
"message": "재구독"
},
"settings.billing.since": {
"message": "{date} 부터"
},
"settings.billing.subscribe": {
"message": "구독"
},
"settings.billing.subscription.description": {
"message": "당신의 Modrinth 구독을 관리하세요."
},
"settings.billing.subscription.title": {
"message": "구독"
},
"settings.billing.switch.switching-to-interval": {
"message": "{interval}으로 변경"
},
"settings.billing.switch.to-interval": {
"message": "{interval}으로 변경"
},
"settings.billing.switch.tooltip.monthly-additional-per-year": {
"message": "월별 결제는 연간 {amount} 만큼 더 부과됩니다"
},
"settings.billing.switches-to-billing-on": {
"message": "{date}에 {interval} 결제로 변경됨"
},
"settings.billing.update-method": {
"message": "결제수단 업데이트"
},
"settings.billing.upgrade": {
"message": "업그레이드"
},
"settings.display.banner.developer-mode.button": {
"message": "개발자 모드 비활성화"
},
@@ -3407,12 +2972,6 @@
"settings.display.flags.title": {
"message": "기능 전환"
},
"settings.display.notification.developer-mode-deactivated.text": {
"message": "개발자 모드가 비활성화 되었습니다"
},
"settings.display.notification.developer-mode-deactivated.title": {
"message": "개발자 모드 비활성화됨"
},
"settings.display.project-list-layouts.datapack": {
"message": "데이터 팩 페이지"
},
@@ -3422,15 +2981,6 @@
"settings.display.project-list-layouts.mod": {
"message": "모드 페이지"
},
"settings.display.project-list-layouts.mode.gallery": {
"message": "갤러리"
},
"settings.display.project-list-layouts.mode.grid": {
"message": "그리드"
},
"settings.display.project-list-layouts.mode.rows": {
"message": "행"
},
"settings.display.project-list-layouts.modpack": {
"message": "모드팩 페이지"
},
@@ -3491,9 +3041,6 @@
"settings.display.theme.title": {
"message": "색상 테마"
},
"settings.head-title": {
"message": "디스플레이 설정"
},
"settings.pats.action.create": {
"message": "PAT 생성"
},
@@ -3534,10 +3081,10 @@
"message": "토큰 해지"
},
"settings.pats.token.expired-ago": {
"message": "{ago}에 만료"
"message": "{ago} 에 만료"
},
"settings.pats.token.expires-in": {
"message": "{inTime}에 만료"
"message": "{inTime}에 만료"
},
"settings.pats.token.last-used": {
"message": "{ago} 에 사용됨"
@@ -3554,9 +3101,6 @@
"settings.profile.description": {
"message": "당신의 프로필 정보는 Modrinth나 <docs-link>Modrinth API</docs-link>를 통해 공개될 수 있습니다."
},
"settings.profile.head-title": {
"message": "프로필 설정"
},
"settings.profile.profile-info": {
"message": "프로필 정보"
},
@@ -3587,30 +3131,12 @@
"settings.sessions.unknown-platform": {
"message": "알 수 없는 플랫폼"
},
"settings.sidebar.label.account": {
"message": "계정"
},
"settings.sidebar.label.developer": {
"message": "개발자"
},
"settings.sidebar.label.display": {
"message": "디스플레이"
},
"ui.latest-news-row.latest-news": {
"message": "Modrinth의 최신 뉴스"
},
"ui.latest-news-row.view-all": {
"message": "모든 뉴스 보기"
},
"ui.newsletter-button.subscribe": {
"message": "구독"
},
"ui.newsletter-button.subscribed": {
"message": "구독됨!"
},
"ui.newsletter-button.tooltip": {
"message": "Modrinth 뉴스레터 구독"
},
"version.environment.none.description": {
"message": "이 버전의 환경이 지정되지 않았습니다."
},

Some files were not shown because too many files have changed in this diff Show More